Class java 中静态变量的级别锁定
Class level lock for static variables in java
如果我在我的 java class X 中不使用任何 setters/getters。当线程 A 具有我的 class 的 class 级别锁时X.另一个线程B可以直接改变我的静态变量吗??
public class X {
Integer static_variable = 10;
public static void doNothing {
/* Do Nothing */
}
}
假设线程 A 现在有 class 级锁。我可以从另一个线程 B 做 X.static_variable = 11 吗?
我正在编写代码来解决 java 中的死锁问题。
public class A 实现 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();
}
}
}
public class 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();
}
}
}
但得到以下结果:
第二个有对象 b 的键并等待
首先有对象 a 的键并等待
第一次从睡梦中醒来
第二次从睡梦中醒来
第二个想要一把钥匙
二过
首先要 b 的 Key
第一名
第二个线程显然正在编辑 class A 的静态变量,即使另一个线程持有 class A
的 class 级锁
是的,你可以。除非你在变量更改代码周围有一个 synchronized 块。如果不使用 synchronization,其他线程在更改其 static_variable[= 之前不必获取 X.class
的监视器22=].
将字段设为private
,并添加一个setter
,使其同步,那么当另一个线程时,您将无法更改该字段持有 X.class
的锁
如果我在我的 java class X 中不使用任何 setters/getters。当线程 A 具有我的 class 的 class 级别锁时X.另一个线程B可以直接改变我的静态变量吗??
public class X {
Integer static_variable = 10;
public static void doNothing {
/* Do Nothing */
}
}
假设线程 A 现在有 class 级锁。我可以从另一个线程 B 做 X.static_variable = 11 吗?
我正在编写代码来解决 java 中的死锁问题。
public class A 实现 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();
}
}
}
public class 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();
}
}
}
但得到以下结果:
第二个有对象 b 的键并等待 首先有对象 a 的键并等待 第一次从睡梦中醒来 第二次从睡梦中醒来 第二个想要一把钥匙 二过 首先要 b 的 Key 第一名
第二个线程显然正在编辑 class A 的静态变量,即使另一个线程持有 class A
的 class 级锁是的,你可以。除非你在变量更改代码周围有一个 synchronized 块。如果不使用 synchronization,其他线程在更改其 static_variable[= 之前不必获取 X.class
的监视器22=].
将字段设为private
,并添加一个setter
,使其同步,那么当另一个线程时,您将无法更改该字段持有 X.class