我需要对类级别锁定中的静态变量行为有一些了解。

设想:
考虑下面称为数据的类。

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));
    }
}

这里,
  • 线程A调用updateI()方法并获取锁。
  • 同时,线程B正在调用getJ()方法。
  • 它将被阻止为线程B
    因为线程-A已经获取了类级别的锁?
    否则它将允许
    同时访问这两种方法?

  • 谢谢....

    最佳答案

    简而言之-它不会被锁定。

    如果希望将其锁定,则还需要保护getJ函数:

    public void getJ() {
        synchronized (Data.class) {
            System.out.println(fmt() + " > " + Thread.currentThread().getName() + (" READ > "+ j));
        }
    }
    

    这与静态变量无关。变量本身无法锁定。仅访问它们。如果您允许通过getJ进行解锁访问,那么没有什么可以阻止您的。

    09-26 12:31