当前位置: 首页 > 知识库问答 >
问题:

java中静态变量的类级锁

红朝
2023-03-14

如果我在java类X中不使用任何setter/getter。当一个线程a具有类X的类级锁时,另一个线程B是否可以直接更改我的静态变量??

public class X {

    Integer static_variable = 10;

    public static void doNothing {
        /* Do Nothing */
    }

}

假设线程A现在有类级锁。我可以从另一个线程B执行X.static\u variable=11吗?

我正在编写一段代码,以在java中获得死锁。

公共类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();
    }
}

}

公共类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的钥匙和等待第一个从睡眠中醒来第二个从睡眠中醒来第二个想要a的钥匙第二个超过第一个想要b的钥匙第一个超过

第二个线程显然正在编辑类A的静态变量,即使另一个线程持有类A的类级锁

共有1个答案

聂鹏云
2023-03-14

是的,你可以。除非在变量更改代码周围有一个同步块。如果不使用同步,则其他线程不必在更改其静态变量之前获取X.class的监视器。

将字段设置为私有,并添加一个setter,使其同步,这样,当另一个线程持有X.class的锁时,您将无法更改字段

 类似资料:
  • 问题内容: 根据Java,静态变量可以通过类名访问,但是即使Java不建议使用静态变量,类对象也可以访问它们,并且给出相同的答案。 我知道该变量只有一个副本,并且所有对象和其他事物的值都相同。Java为什么建议使用类名而不是类对象? 问题答案: 因为可能会造成混淆!静态成员上没有动态调度。 看一下这个令人困惑的代码:(可能是语法错误;我的Java生锈了) 看起来很混乱,因为方法似乎是多态的,所以输

  • rank ▲ ✰ vote url 26 568 149 609 url 类里的静态变量 有可能在python中类有静态变量或方法?用什么语法实现? 变量是在类定义时声明的,不是在类方法或静态变量中: >>> class MyClass: ... i = 3 ... >>> MyClass.i 3 上面的"i"变量是类级别的,所以它是和所有实体级的"i"变量是不一样的,你可以: >>>

  • 问题内容: 我有以下类别,将其用作项目中所有模型的基础: 然后,我尝试通过以下方式对其进行扩展: 但是,如果我尝试执行以下操作: 然后,而不是查询:,它生成查询:“从空WHERE id =?中选择SELECT ID”。因此,覆盖类中的字段似乎没有任何效果。 我该如何克服呢?如果我在BaseModel中添加了一个方法,并在的构造函数中对其进行了调用,那么该类的所有方法都可以使用的新值吗? 问题答案:

  • 我有以下代码: 当我尝试编译它时,会出现以下错误: 因此,我尝试使dbConnect静态如下:

  • 问题内容: 将变量声明为的区别是什么 要么 如果我只希望变量是局部的,并且是常量(以后不能更改)? 谢谢 问题答案: 仅仅具有预期的效果。 声明static使其成为一个类变量,使其可以使用类名进行访问

  • 我写了一个简单的类和3个测试如下: 个人测试。爪哇: 测试numberOfPersons失败,消息为:java。lang.AssertionError:预期: