2013-07-22 17 views
6
public synchronized int getCountOne() { 
     return count++; 
} 

Podobnie jak w powyższym kodzie synchronizacja w metodzie jest funkcjonalnie równoważna posiadaniu synchronized (this) block wokół całego ciała metody. Obiekt "this" nie zostaje zablokowany, a obiekt "this" jest używany jako mutex, a ciało nie może wykonywać jednocześnie z innymi sekcjami kodu również zsynchronizowanymi w "tym".W jaki sposób pozyskano blokadę poziomu klasowego?

Z podobnych powodów, co jest wykorzystywane jako mutex kiedy nabyć lock.As poziomie klasy, jeśli mamy funkcję

public static synchronized int getCountTwo() { 
     return count++; 
} 

oczywiście dwa wątki mogą jednocześnie uzyskać zamki getCountOne (blokada poziom obiektu) i getCountTwo (blokada na poziomie klasy). Więc jak getCountOne jest analogiczny do

public int getCountOne() { 
    synchronized(this) { 
      return count++; 
    } 
} 

czy istnieje odpowiednik getCountTwo? Jeśli nie ma jakich kryteriów używa się do uzyskania blokady na poziomie klasy?

Odpowiedz

10

Z podobnych powodów, co jest wykorzystywane jako mutex kiedy uzyskania blokady poziomie klasy

Sam obiekt klasy zostaną wykorzystane jako mutex. Równowartość synchronizowany blok dla metody static synchronized będzie wyglądać następująco:

public static int getCountTwo() { 
    synchronized(ClassName.class) { 
      return count++; 
    } 
} 

ClassName to nazwa klasy zawierającej tę metodę.

Patrz JLS Section §8.4.3.6:

Zsynchronizowany sposób uzyskuje monitora (§17.1) przed jego uruchomienia.

W przypadku metody klasowej (statycznej), używany jest monitor powiązany z obiektem klasy dla klasy metody.

Dla metody instancji używany jest monitor powiązany z tym obiektem (obiekt , dla którego metoda została wywołana).

Podkreślam moją.

+0

Dzięki za miłe wyjaśnienie – Prabhaker

0

zamek poziom obiektu: zamek poziom

Obiekt jest mechanizm, gdy chcesz synchronizować metodę non-statyczne lub non-statyczny blok kodu tak, że tylko jeden wątek będzie mógł wykonać blok kodu na dany wystąpienie klasy. Należy to zawsze zrobić, aby zapewnić bezpieczny wątek na poziomie instancji. Można to zrobić jak poniżej: zamek poziom

public class DemoClass 
{ 
    public synchronized void demoMethod(){} 
} 

or 

public class DemoClass 
{ 
    public void demoMethod(){ 
    synchronized (this) 
    { 
    //other thread safe code 
    } 
} 
} 

or 

public class DemoClass 
{ 
    private final Object lock = new Object(); 
    public void demoMethod(){ 
    synchronized (lock) 
{ 
    //other thread safe code 
} 
} 

Klasa:

zamek poziomie klasy zapobiega wielu wątków, aby wejść w bloku zsynchronizowanego w żadnym z przypadków wszystkich dostępnych na starcie. Oznacza to, że jeśli w środowisku wykonawczym jest 100 instancji klasy DemoClass, to tylko jeden wątek będzie w stanie wykonać demoMethod() w dowolnym momencie na raz, a wszystkie inne wystąpienia będą zablokowane dla innych wątków.Należy to zawsze zrobić, aby zapewnić bezpieczny wątek danych statycznych.

+0

Nie odpowiada na pytanie: "co jest używane jako muteks"? – EJP

Powiązane problemy