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

Как и в приведенном выше коде, синхронизация по методу функционально эквивалентна наличию synchronized (this) block вокруг тела метода. Объект «это» не блокируется, а объект «это» используется как mutex, и тело не может выполнять одновременно с другими разделами кода, также синхронизированными по «этому».Как фиксируется замок уровня

На тех же основаниях, что используется в качестве mutex, когда мы приобретаем уровня класса lock.As, если мы имеем функцию

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

, очевидно, два потока могут одновременно получать замки на getCountOne (объект блокировки уровня) и getCountTwo (блокировка уровня). Так как getCountOne аналогичен

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

есть ли эквивалент getCountTwo? Если какие-либо критерии не используются для получения блокировки уровня Класса?

ответ

10

На тех же основаниях, что используется в качестве мьютекса, когда мы приобретаем блокировку уровня класса

Сам класс объекта будет использоваться в качестве мьютекса. Эквивалент синхронизируются блок для вашего метода static synchronized будет выглядеть следующим образом:

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

ClassName это имя класса, содержащего этот метод.

JLS Section §8.4.3.6 См:

Синхронизированный метод получает монитор (§17.1) перед выполнением.

Для класса (статического) метода, используется монитор, связанный с классом для класса метода.

Для метода экземпляра используется связанный с ним монитор (объект , для которого был вызван метод).

Emphasis mine.

+0

Спасибо за красивое объяснение – Prabhaker

0

блокировка на уровне объекта:

Объект блокировки уровня механизм, когда вы хотите синхронизировать, не статический метод или не статический блок кода, так что только один поток будет в состоянии выполнить блок кода на данные экземпляр класса. Это всегда должно быть сделано для обеспечения безопасного потока данных уровня экземпляра. Это может быть сделано, как показано ниже: Уровень

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 
} 
} 

Класс блокировка:

уровня Класс блокировки предотвращает несколько потоков, чтобы войти в синхронизированный блок в любом из всех доступных экземпляров на время выполнения. Это означает, что если во время выполнения имеется 100 экземпляров DemoClass, то только один поток сможет выполнять demoMethod() в любом экземпляре за раз, а все остальные экземпляры будут заблокированы для других потоков.Это всегда должно быть сделано для обеспечения безопасности статических данных.

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

or 

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

or 

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

Не отвечает на вопрос: «что используется как мьютекс»? – EJP

Смежные вопросы