2009-10-15 30 views
23

Moje pytanie dotyczy tego, czy korzystanie z ReentrantLock gwarantuje widoczność pola z takim samym szacunkiem, jakie zapewnia zsynchronizowane słowo kluczowe.Czy zmienne słowo kluczowe jest wymagane w polach dostępnych za pośrednictwem ReentrantLock?

Na przykład w poniższej klasie , pola shareddata nie muszą być deklarowane jako lotny zsynchronizowane parametr jest używany.

class A 
{ 
    private double sharedData; 

    public synchronized void method() 
    { 
    double temp = sharedData; 
    temp *= 2.5; 
    sharedData = temp + 1; 
    } 
} 

Dla następnego przykładu użycie ReentrantLock jest jednak zmiennym słowem kluczowym na polu?

class B 
{ 
    private final ReentrantLock lock = new ReentrantLock(); 
    private volatile double sharedData; 

    public void method() 
    { 
    lock.lock(); 
    try 
    { 
     double temp = sharedData; 
     temp *= 2.5; 
     sharedData = temp + 1; 
    } 
    finally 
    { 
     lock.unlock(); 
    } 
    } 
} 

wiem, że za pomocą słowa kluczowego lotnych i tak będzie prawdopodobnie tylko nałożyć malutkie spadek wydajności, ale nadal chce zakodować poprawnie.

Odpowiedz

28

Jest bezpieczny bez zmienności. ReentrantLock realizuje Lock i docs for Lock to w ten sposób:

Wszystkie implementacje Lock musi egzekwować tej samej synchronizacji pamięci semantyka przewidziane przez wbudowany blokady monitora, jak opisano w Java Language Specification, wydanie trzecie (model 17,4 Memory):

  • Udana lock operacja ma same skutki synchronizacji pamięci jako udana akcja Lock.
  • Udana operacja unlock ma takie same efekty synchronizacji pamięci, jak jako akcja zakończona powodzeniem .
+0

Czy ta rada jest prawdziwa w odniesieniu do 'while (field)' ze względu na podnoszenie pola? – Pod

+0

@Pod: Bez szczegółowych informacji o tym, jak pętla 'while' wchodzi w interakcje z blokadą, nie można powiedzieć. Prawdopodobnie chcesz utworzyć nowe pytanie z konkretnym przykładem. –