Każdy jest innym i nikt sobą samym.

Obiekty i są przekazywane do konstruktorów
klas ) ! i # , które odpowiednio traktują je jak obiekty ) i / dowolnego typu
(to znaczy, że są one rzutowane w górę).
Tablica $ odwołań 1%$ nie jest inicjowana w miejscu swej definicji, ponieważ strumienie
potokowe nie mogą być ustawione przed wystąpieniem tej definicji (potrzeba istnienia bloku
na to nie pozwala).
7 5
)- & *+,
*-
*- ./0 /12
4 *- ./O 5% 54 /1(
) (
-)?@)(
4E (
4H (
0 9%% + 9 ,
) 4 %.+ < 1,
.> 1,
(
. #() !(==1
)?@ .1(
:
:
:
04 9%% + 9 ,
) 4 %.+ < 1,
C%
7! .1
. #() !(==1
)?@4 .1(
:
:
) .1,
4 .1(
9 . 89 .11(
4E .1(
,
4H . 1(
:!.;3<& 1,
0% ./4 )%54H /1(
:
) -)?@,
0 .12
0 G.12
0 H %.12
0 H %G.12
E.12
EG.12
0 .2 12
H .2 1
:(
+ 9 . 0 9.11(
. 1(
4 + 9 .
04 9.11(
.4 1(
:
)% .0 ?@ 1,
. - .12"D#2DD#1(
:
:A
W metodzie mamy pętlę przechodzącą przez całą tablicę i dodającą stan oraz pole
tekstowe % na stronę.
Kiedy tworzone są wątki 1%$ , to każdy z nich automatycznie tworzy i uruchamia swój wła-
sny % . Zatem wątki % będą działać, zanim wystartuje wątek 1%$ . Jest to istotne,
ponieważ niektóre z obiektów % zostaną zablokowane i zatrzymane, kiedy wątki 1%$
wystartują. Konieczne trzeba to zobaczyć, aby zrozumieć ten szczególny aspekt blokowania.
( #
Ponieważ wątki mogą być blokowane i ponieważ obiekty mogą posiadać metody synchronizowa-
ne, nie pozwalające wątkom na dostęp do tych obiektów, dopóki nie zostanie zwolniony zamek
synchronizacji, to jest możliwe, iż wątek utknie, oczekując na inny wątek, który czeka na inny
wątek itd., aż łańcuch powróci do wątku czekającego na ten pierwszy. Dostajemy zamkniętą pętlę
wątków, czekających na siebie wzajemnie, a żaden nie może się ruszyć — nazywa się to impasem
(ang. deadlock). Nadzieja, że taka trudna sytuacja zdarza się bardzo rzadko, nie pomaga, kiedy
przyjdzie nam testować i wyszukiwać błędy w kodzie, który wywołał impas.
Nie mamy wsparcia ze strony języka pomagającego unikać impasu — wszystko zależy od nas, czy
unikniemy go przez ostrożne projektowanie. Nie są to słowa pocieszające dla osoby, która usiłuje
usuwać błędy w programie, w którym wystąpił impas.
! "#$ %"#$ % "# "# &' (
Jedną ze zmian, dokonaną w Java 2, aby zmniejszyć możliwość impasu, jest niezalecanie nastę-
pujących metod klasy Thread: , , oraz .
Przyczyną tego, iż metoda stała się nie zalecana jest fakt, że nie zwalnia blokad, które wą-
tek posiada, i jeżeli obiekty są w stanie niespójnym („uszkodzone”), inne wątki mogą je w takim
stanie podglądać i modyfikować. Wynikające problemy mogą być subtelne i trudne do wykrycia.
Zamiast używać , powinieneś stosować się do tego, co zostało pokazane w przykładzie
1% ! i używać znaczników do informowania wątku, kiedy ma zakończyć się przez wyj-
ście ze swej metody .
Są sytuacje, kiedy wątek się blokuje — tak jak wtedy, gdy oczekuje na dane wejściowe — i nie
może sprawdzić znacznika, jak było to w 1% !. W takich przypadkach nadal nie powin-
no się używać , a zamiast tego można użyć metody z klasy , aby wydo-
stać się z zablokowanego kodu:
;
+ N
%.15)
; ! G##!! ##$
$
% & '(
% '(
% '(
% %) '(
-& 7! ,
) ! 5 .1,
,
.1(-
:!.; <& 1,
0% ./4 5 /1(
:
0% ./EN5 .1/1(
:
:
); & *+,
*-
*- ./4 5 /1(
-) -.1(
) .1,
4 .1(
9 . 89 .11(
. 1(
9 .
+ 9 .1,
)
4 %.+ < 1,
0% ./4 5N I/1(
.) 1 (
7! % )(
) ()5 J
% .1(
:
:1(
) .1(
:
)% .0 ?@ 1,
. ; .12G##2##1(
:
:A
Wywołanie 0 wewnątrz 1% powoduje zablokowanie wątku. Po wciśnięciu przy-
cisku referencja $% jest ustawiana na , a zatem odśmiecacz pamięci ją sprzątnie i zostaje
wywołana metoda tego obiektu. Przy pierwszym wciśnięciu przycisku wątek zostanie
zakończony, ale po tym nie będzie już żadnego wątku do zabicia.
Metody i mogą łatwo spowodować impas. Po wywołaniu wątek
zostanie zatrzymany, ale ciągle będzie przetrzymywał jakieś blokady, które nabył do tej pory. Tak
więc żaden inny wątek nie może dostać się do zamkniętych zasobów, dopóki zawieszony wątek

Tematy