Означает ли это, что любой Thread независимо от объекта, который он получает, не будет мешать другим 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 и основной поток не будут вводить метод, даже если оба имеют разные объекты. Исправьте меня, если я ошибаюсь.
Если Thread t1 входит в статический метод, тогда t2 и основной поток не будут вводить метод, хотя оба имеют разные объекты
его static
метод, который является методом класса (общего) для всех экземпляров (объектов) этого класса, следовательно, объекты не имеют значения. Если он объявлен как synchronized
, то Thread, который будет выполнять этот метод, получит блокировку объекта класса (объект Class<Test>
),
static synchronized
метод можно рассматривать как ниже
public static testMethod(){
synchronized(Test.class) {
//method body
}
}
Поскольку класс загружается один раз (если вы не определяете свой пользовательский загрузчик классов и повторно загружаете класс), будет существовать только один объект класса, который действует как блокировка для взаимного исключения
Ты думаешь об этом, все неправильно. Не пишите это:
public class Test implements Runnable {
static synchronized SomeType testMethod() { ... }
...
}
Напишите это вместо этого. Это означает точно то же самое, но оно показывает, что происходит:
public class Test implements Runnable {
static SomeType testMethod() { synchronized(Test.class) {...} }
...
}
Затем все, что вам нужно знать, это то, что Test.class - это уникальный объект (объект, который содержит описание вашего тестового класса), и, конечно же, ни один из двух потоков не может синхронизироваться на одном и том же объекте одновременно.
То же самое касается синхронных методов экземпляра:
public class Test implements Runnable {
synchronized SomeType testMethod() { ... }
...
}
Означает то же, что и
public class Test implements Runnable {
SomeType testMethod() { synchronized(this) {...} }
...
}
Но второй показывает, что происходит на самом деле.
T1 и T2 синхронизируются в Object Test.class
. Помните, что классы - это объекты типа java.lang.Class