Если я не использую какие-либо сеттеры/геттеры в моем классе java. Когда поток A имеет блокировку уровня класса моего класса X. Может ли другой поток B напрямую изменить статическую переменную? ?Блокировка уровня класса для статических переменных в java
public class X {
Integer static_variable = 10;
public static void doNothing {
/* Do Nothing */
}
}
Скажем, нить A теперь имеет блокировку уровня. Могу ли я сделать X.static_variable = 11 из другого потока B?
Я писал код, чтобы получить тупик в java.
общественный класс А реализует Runnable {
public static Integer as = 5;
static A a = new A();
static B b = new B();
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Thread thread1 = new Thread(a);
Thread thread2 = new Thread(b);
thread1.setName("First");
thread2.setName("Second");
thread1.start();
thread2.start();
}
public void run() {
runme();
}
public static synchronized void runme() {
try {
System.out.println(Thread.currentThread().getName() + " has object a's key and waiting");
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " Woke up from sleep");
System.out.println(Thread.currentThread().getName() + " wants b's Key");
B.bs = 10;
System.out.println(Thread.currentThread().getName() + " over");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
общественного класса B реализует Runnable {
public static Integer bs = 6;
public void run() {
runme();
}
public static synchronized void runme() {
try {
System.out.println(Thread.currentThread().getName() + " has object b's key and waiting");
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " Woke up from sleep");
System.out.println(Thread.currentThread().getName() + " wants a's Key");
A.as = 10;
System.out.println(Thread.currentThread().getName() + " over");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Но получить результат ниже:
Второй имеет ключевой объект Б и ждет Первый имеет объект А вот ключ и ждет Первый Проснулся от сна Второй просыпался от сна Второй хочет это ключ Второй над Первая хочет Key Сначала над
Второй поток Б явно редактирования статической переменной класса А, даже если другой поток удерживает блокировку на уровне класса класса А