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

的锁