Java >> Java tutorial >  >> Tag >> synchronized

synkroniseret objekt sat til null

Dette vil næsten helt sikkert bryde synkroniseringsabstraktionen -- jeg ville ikke være sikker på, at thread2 vil se ændringen med det samme. Du bør aldrig ændre referencen for det objekt, du synkroniserer på, meget mindre indstille det til null , hvilket vil forårsage en NullPointerException på yderligere forsøg på at synkronisere på den.


Lad mig først understrege, at ændring af en variabel, der bruges til synkronisering, er en frygtelig dårlig ting . obj1 skal være final og må aldrig røres, hvis den bruges som monitor.

Når det er sagt, tilbage til dit spørgsmål:

Hvis JVM først udfører Thread1, synkroniseres den på obj1 , indstiller den til null og tråden forlader. Den anden tråd ønsker at synkronisere på obj1 , NullPointerException vil blive kastet. Fordi ændringen af ​​obj1 blev lavet i synkroniseret blok, er det garanteret, at Thread2 vil se opdateret værdi (altså:NullPointerException er garanteret).

Hvis Thread1 afbrydes efter at have opnået låsen på obj1 men før du sletter referencen, låser Thread2 obj1 og vent, indtil tråd 1 er færdig. Derefter vil den komme ind på monitoren, fordi objektet tidligere refereret til af obj1 eksisterer stadig.


synchronized synkroniserer på objektet og ikke referencen. Ved at indstille obj1 (en reference) til null, tråd2 kan ikke synkronisere på det objekt, der tidligere blev peget på af obj1 , får du en NullPointerException i stedet.


Java tag