我需要清楚地了解类级别锁定中的静态变量行为。
场景: 考虑以下名为 Data 的类。
public class Data {
private static int i = 1;
private static int j = 1;
public void updateI() {
synchronized (Data.class) {
++i;
System.out.println(fmt() + " > " + Thread.currentThread().getName() + (" UPDATED > "+ i));
}
}
public void getJ() {
System.out.println(fmt() + " > " + Thread.currentThread().getName() + (" READ > "+ j));
}
}
这里,
- Thread-A 调用 updateI() 方法并获取锁。
- 同时 Thread-B 正在调用 getJ() 方法。
- 会不会阻塞Thread-B 因为类级锁已经被 Thread-A 获取了? 或者它将允许 同时访问这两种方法?
谢谢....
最佳答案
简而言之 - 它不会被锁定。
如果你想让它被锁定,你还需要保护 getJ 函数:
public void getJ() {
synchronized (Data.class) {
System.out.println(fmt() + " > " + Thread.currentThread().getName() + (" READ > "+ j));
}
}
这与静态变量无关。变量本身不能被锁定。只能访问它们。如果您允许通过 getJ 解锁访问,没有什么可以阻止您。
关于java - 类级锁定中的静态变量行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58504516/