2014-09-03 2 views
1

Означает ли это, что любой нить независимо от объекта, который он получает, не будет мешать другим Thread, выполняющемуся в Synchronized static method. Даже если мы вызываем с class_name.static_Method.Статический синхронизированный метод обеспечивает блокировку уровня класса. Что означает блокировка уровня класса?

Ex- If we have two thread : 

public class Test implements Runnable { 

    public synchronized static testMethod(){} 

    public void run(){ testMethod(); } 

    public static void main(String[] args) { 
    Test obj1=new Test(); 
    Test obj2=new Test(); 
    Thread t1=new Thread(obj1); 
    Thread t2=new Thread(obj2); 
    t1.start(); // thread on object obj1 
    t2.start(); // Thread on object obj2 
    Test.testMethod(); // main thread 
} 
} 

Если Thread t1 входит статический метод, то t2 и основной поток не будет входить метод, даже если оба имеют другой объект. Исправьте меня, если я ошибаюсь.

ответ

0

Если поток T1 входит статический метод, то t2 и основной поток не будет входить метод, даже если оба имеют другой объект

сво static метод, который является (общий) Метод уровня Класс ко всем экземплярам (объектам) этого класса, следовательно, объекты не имеют значения. Если ее объявлен synchronized, то тема, которая будет выполняться метод будет получить блокировку на объект класса (Class<Test> объекта)

метод static synchronized можно мыслить как ниже

public static testMethod(){ 
    synchronized(Test.class) { 
     //method body 
    } 
} 

Поскольку класс получает (если вы не определяете свой пользовательский класс-загрузчик и не перезагружаете класс), будет существовать только один объект класса, который действует как блокировка для взаимного исключения.

+0

Означает ли это, что если поток t1 входит в статический синхронизированный блок, тогда t1 получит две блокировки для объекта obj1 и второй для объекта класса. – Nizam

+0

Что означает Class.class? Можем ли мы написать это вместо Test.class. – Nizam

+0

Нет .. нет необходимости приобретать блокировку объекта, в этом случае 't1' будет только блокировать объект класса. Поскольку для каждого класса существует только один объект класса, когда 't1' выполняет метод« статический синхронизированный », никакой другой поток не будет разрешен (взаимное исключение) – sanbhat

0

T1 и T2 синхронизируются по объекту Test.class. Помните, что классы являются Объектами типа java.lang.Class

+0

Что означает Class.class? Можем ли мы написать это вместо Test.class – Nizam

+0

Класс.class означает объект класса java.lang.Class.Why и вы хотите синхронизировать его. –

+0

Я просто хочу знать, что если заменить Test.class классом Class.class, это будет логически корректно. – Nizam

1

Вы думаете об этом, все неправильно. Не пишите это:

Напиши это вместо этого. Это означает, что точно то же самое, но это показывает, что происходит:

public class Test implements Runnable { 
    static SomeType testMethod() { synchronized(Test.class) {...} } 
    ... 
} 

Тогда все, что вам нужно знать, что Test.class является уникальным объектом (это объект, который содержит описание вашего класса Test) , и, конечно, ни один из двух потоков не может синхронизировать один и тот же объект одновременно.

То же самое относится и к синхронизированных методов экземпляра: Это,

public class Test implements Runnable { 
    synchronized SomeType testMethod() { ... } 
    ... 
} 

означает то же самое, как

public class Test implements Runnable { 
    SomeType testMethod() { synchronized(this) {...} } 
    ... 
} 

Но второй один показывает вам, что происходит на самом деле.

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