[{"@context":"http:\/\/schema.org\/","@type":"BlogPosting","@id":"https:\/\/wiki.edu.vn\/all2pl\/wiki27\/dwukrotnie-sprawdzane-blokowanie-wikipedia\/#BlogPosting","mainEntityOfPage":"https:\/\/wiki.edu.vn\/all2pl\/wiki27\/dwukrotnie-sprawdzane-blokowanie-wikipedia\/","headline":"Dwukrotnie sprawdzane blokowanie-Wikip\u00e9dia","name":"Dwukrotnie sprawdzane blokowanie-Wikip\u00e9dia","description":"before-content-x4 W in\u017cynierii oprogramowania, Podw\u00f3jne blokowanie testu Lub Dwukrotnie sprawdzone blokowanie jest by\u0142ym szefem projektowym [[[ Pierwszy ] . after-content-x4","datePublished":"2021-09-16","dateModified":"2021-09-16","author":{"@type":"Person","@id":"https:\/\/wiki.edu.vn\/all2pl\/wiki27\/author\/lordneo\/#Person","name":"lordneo","url":"https:\/\/wiki.edu.vn\/all2pl\/wiki27\/author\/lordneo\/","image":{"@type":"ImageObject","@id":"https:\/\/secure.gravatar.com\/avatar\/44a4cee54c4c053e967fe3e7d054edd4?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/44a4cee54c4c053e967fe3e7d054edd4?s=96&d=mm&r=g","height":96,"width":96}},"publisher":{"@type":"Organization","name":"Enzyklop\u00e4die","logo":{"@type":"ImageObject","@id":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","url":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","width":600,"height":60}},"image":{"@type":"ImageObject","@id":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","url":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","width":100,"height":100},"url":"https:\/\/wiki.edu.vn\/all2pl\/wiki27\/dwukrotnie-sprawdzane-blokowanie-wikipedia\/","wordCount":2341,"articleBody":" (adsbygoogle = window.adsbygoogle || []).push({});before-content-x4W in\u017cynierii oprogramowania, Podw\u00f3jne blokowanie testu Lub Dwukrotnie sprawdzone blokowanie jest by\u0142ym szefem projektowym [[[ Pierwszy ] . (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4Uwa\u017cany dzisiaj za antypattern ze wzgl\u0119du na subtelne problemy i trudne do wykrycia, w przesz\u0142o\u015bci u\u017cywano go do zmniejszenia dodatkowego kosztu nabycia zamka niezb\u0119dnego do p\u00f3\u017anej inicjalizacji singletonu, zaczynaj\u0105c od sprawdzenia obiektu zamka Bez ostro\u017cno\u015bci wcze\u015bniej, aby faktycznie umie\u015bci\u0107 zamek. We\u017amy na przyk\u0142ad nast\u0119puj\u0105c\u0105 klas\u0119 Java: (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4\/\/ wersja mono-{{j\u0119zyk | in | text = w\u0105tek}} klasa Singleton1 { prywatny Narz\u0119dzie narz\u0119dzie = zero ; publiczny Narz\u0119dzie Getoutil () { Je\u015bli ( narz\u0119dzie == zero ) { narz\u0119dzie = nowy Narz\u0119dzie (); } powr\u00f3t narz\u0119dzie ; } \/\/ Inne atrybuty i metody ... } Problem tej klasy polega na tym, \u017ce nie dzia\u0142a w multi- nitka . Je\u015bli dwa w\u0105tki Zadzwo\u0144 po raz pierwszy Getoutil () Jednocze\u015bnie wszyscy utworz\u0105 obiekt w tym samym czasie, co drugi lub jeden otrzyma odniesienie do cz\u0119\u015bciowo zainicjowanego obiektu. Aby tego unikn\u0105\u0107, musisz u\u017cy\u0107 blokady, kt\u00f3ra odbywa si\u0119 dzi\u0119ki synchronizacji, jak pokazano na przyk\u0142adzie kodu poni\u017cej. \/\/ poprawna wersja w \u015brodowisku wielu-{{j\u0119zyk | in | text = w\u0105tek}}, ale potencjalnie kosztowne klasa Singleton2 { prywatny Narz\u0119dzie narz\u0119dzie = zero ; publiczny zsynchronizowane Narz\u0119dzie Getoutil () { Je\u015bli ( narz\u0119dzie == zero ) { narz\u0119dzie = nowy Narz\u0119dzie (); } powr\u00f3t narz\u0119dzie ; } \/\/ Inne atrybuty i metody ... } Tutaj, pierwsze wezwanie Getoutil () utworzy obiekt i je\u015bli inne w\u0105tki dzwoni\u0107 Getoutil () Podczas gdy obiektem jest lekcje inicjalizacji, zostan\u0105 one wstrzymane przez synchronizacj\u0119, dop\u00f3ki obiekt nie zostanie ca\u0142kowicie zainicjowany nitka . Wszystkie nast\u0119puj\u0105ce po\u0142\u0105czenia zwr\u00f3c\u0105 tylko odniesienie do wcze\u015bniej zainicjowanego obiektu. Jednak synchronizacja metody mo\u017ce znacznie zwi\u0119kszy\u0107 czas jej wykonania [[[ 2 ] . Pozyskiwanie i uwalnianie zamka za ka\u017cdym razem, gdy nazywana jest metoda mo\u017ce wydawa\u0107 si\u0119 niepotrzebnym dodatkowym kosztem. Wielu programist\u00f3w pr\u00f3bowa\u0142o zoptymalizowa\u0107 ten kod w nast\u0119puj\u0105cy spos\u00f3b: Sprawd\u017a, czy zmienna nie zosta\u0142a jeszcze zainicjowana (bez pr\u00f3by uzyskania zamka). Je\u015bli tak, natychmiast obr\u00f3\u0107 swoj\u0105 warto\u015b\u0107; zdoby\u0107 zamek; Ponownie przekonuj, \u017ce zmienna nie zosta\u0142a jeszcze zainicjowana: je\u015bli inna nitka Naby\u0142 blokad\u0119 tu\u017c wcze\u015bniej, w mi\u0119dzyczasie m\u00f3g\u0142 zainicjowa\u0107 zmienn\u0105. Je\u015bli oka\u017ce si\u0119, \u017ce zmienna jest inicjowana, zwr\u00f3\u0107 jej warto\u015b\u0107; W przeciwnym razie zainicjuj zmienn\u0105 i zwr\u00f3\u0107 jej warto\u015b\u0107. \/\/ Wersja {{j\u0119zyk | in | text = multitreaded}} b\u0142\u0119dny \/\/ motyw \u201eDwukrotnie sprawdzane blokowanie\u201d klasa Singleton3 { prywatny Narz\u0119dzie narz\u0119dzie = zero ; publiczny Narz\u0119dzie Getoutil () { Je\u015bli ( narz\u0119dzie == zero ) { zsynchronizowane ( Ten ) { Je\u015bli ( narz\u0119dzie == zero ) { narz\u0119dzie = nowy Narz\u0119dzie (); } } } powr\u00f3t narz\u0119dzie ; } \/\/ Inne atrybuty i metody ... } Intuicyjnie algorytm ten wydaje si\u0119 skutecznym rozwi\u0105zaniem postawionego problemu. Jednak podnosi subtelne i trudne do \u015bledzenia problemy. W ten spos\u00f3b rozwa\u017c sekwencj\u0119 nast\u0119puj\u0105cych zdarze\u0144: (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4. nitka A Nale\u017cy pami\u0119ta\u0107, \u017ce zmienna wsp\u00f3\u0142dzielona nie jest inicjowana. Dlatego nabywa zamek i zaczyna inicjowa\u0107 zmienn\u0105; Ze wzgl\u0119du na semantyk\u0119 j\u0119zyka programowania kod generowany przez kompilatora ma prawo do modyfikowania wcze\u015bniejszej zmiennej A zako\u0144czy\u0142 inicjalizacj\u0119, tak \u017ce zmienna odwo\u0142uje si\u0119 do cz\u0119\u015bciowo zainicjowanego obiektu (na przyk\u0142ad dlatego nitka Zacznij od przydzielania pami\u0119ci, a nast\u0119pnie umieszcza odniesienie do bloku pami\u0119ci przydzielonego w zmiennej, przed, wreszcie, do wywo\u0142ania producenta, kt\u00f3ry zainicjuje blok pami\u0119ci); . nitka B Zauwa\u017c, \u017ce wsp\u00f3lna zmienna zosta\u0142a zainicjowana (a przynajmniej wydaje si\u0119 by\u0107) i zwraca swoj\u0105 warto\u015b\u0107 natychmiast bez pr\u00f3by uzyskania zamka. Je\u015bli, w\u00f3wczas wsp\u00f3\u0142dzielona zmienna jest u\u017cywana wcze\u015bniej A nie mia\u0142 czasu na zako\u0144czenie inicjalizacji, program prawdopodobnie sadzi. Jeden z niebezpiecze\u0144stw Dwukrotnie sprawdzone blokowanie Czy to cz\u0119sto wydaje si\u0119 dzia\u0142a\u0107. To zale\u017cy od kompilatora, jak w\u0105tki s\u0105 zamawiane przez system operacyjny, a tak\u017ce inne mechanizmy zarz\u0105dzania dost\u0119pem do danych do danych. Odtwarzanie przypadk\u00f3w sadzenia mo\u017ce by\u0107 trudniejsze, poniewa\u017c s\u0105 wysoce nieprawdopodobne, gdy kod jest wykonywany w debuggerze. Spos\u00f3b u\u017cycia Dwukrotnie sprawdzone blokowanie Dlatego musi zosta\u0107 zakazany jak najwi\u0119cej. Niemniej jednak Javase 5.0 oferuje rozwi\u0105zanie tego problemu ze s\u0142owem zarezerwowanym niestabilnym, co to gwarantuje w\u0105tki R\u00f3\u017cnie w\u0142a\u015bciwie zarz\u0105dza\u0107 konkurencyjnym dost\u0119pem do pojedynczej instancji singletonu [[[ 3 ] : \/\/ dzia\u0142a dzi\u0119ki nowej semantyce niestabilnego s\u0142owa kluczowego \/\/ nie dzia\u0142a z Java 1.4 lub poprzednim klasa Singleton4 { prywatny lotny Narz\u0119dzie narz\u0119dzie = zero ; publiczny Narz\u0119dzie Getoutil () { Je\u015bli ( narz\u0119dzie == zero ) { zsynchronizowane ( Ten ) { Je\u015bli ( narz\u0119dzie == zero ) { narz\u0119dzie = nowy Narz\u0119dzie (); } } } powr\u00f3t narz\u0119dzie ; } \/\/ Inne atrybuty i metody ... } Jednak bezpiecze\u0144stwo dost\u0119pu ma cen\u0119: dost\u0119p do zmiennej zmiennej jest mniej skuteczny ni\u017c dost\u0119p do zmiennej normalnej. Wiele wersji szefa Dwukrotnie sprawdzone blokowanie kt\u00f3re nie stosuj\u0105 jawnej synchronizacji lub zmiennej zmiennej, zosta\u0142y zaproponowane. Opr\u00f3cz tych opartych na s\u0142owie kluczowym enum lub motyw wsparcia inicjalizacji na \u017c\u0105danie, wszystkie okaza\u0142y si\u0119 niepoprawne [[[ 4 ] W [[[ 5 ] . Mo\u017cemy wdro\u017cy\u0107 Dwukrotnie sprawdzone blokowanie Z wizualnym C ++ 2005, je\u015bli wska\u017anik w kierunku zasobu zostanie zadeklarowany lotny . Wizualne C ++ 2005 gwarantuje, \u017ce zmienne zmienne zachowuj\u0105 si\u0119 jak bariery, podobnie jak w przypadku Javase 5.0, uniemo\u017cliwiaj\u0105c zar\u00f3wno kompilator, jak i procesor reordowania odczyt\u00f3w i wpis\u00f3w do tych zmiennych, aby by\u0142y bardziej skuteczne. Poprzednie wersje Visual C ++ nie oferowa\u0142y tej gwarancji. Zaznacz wska\u017anik w kierunku zasobu, poniewa\u017c niestabilne kara wydajno\u015b\u0107 w taki czy inny spos\u00f3b, szczeg\u00f3lnie je\u015bli wska\u017anik jest widoczny w innym miejscu kodu: kompilator traktuje go jako barier\u0119 wsz\u0119dzie tam, gdzie jest u\u017cywany, nawet je\u015bli nie jest to konieczne. \u2191 Schmidt, zm i in. W Architektura oprogramowania zorientowana na wzory W tom. 2, 2000, P. 353-363 \u2191 Boehm, Hans-J., W\u0105tk\u00f3w nie mo\u017cna wdro\u017cy\u0107 jako biblioteki , ACM 2005, P. 265 \u2191 Nowa semantyka s\u0142owa kluczowego lotny jest opisany w [Pierwszy] . \u2191 [2] \u2191 [3] Powi\u0105zane artyku\u0142y [[[ modyfikator |. Modyfikator i kod ] Linki zewn\u0119trzne [[[ modyfikator |. Modyfikator i kod ] (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4"},{"@context":"http:\/\/schema.org\/","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https:\/\/wiki.edu.vn\/all2pl\/wiki27\/#breadcrumbitem","name":"Enzyklop\u00e4die"}},{"@type":"ListItem","position":2,"item":{"@id":"https:\/\/wiki.edu.vn\/all2pl\/wiki27\/dwukrotnie-sprawdzane-blokowanie-wikipedia\/#breadcrumbitem","name":"Dwukrotnie sprawdzane blokowanie-Wikip\u00e9dia"}}]}]