保证在java中的下一个命令之前存储变量值

时间:2013-05-04 14:18:23

标签: java variable-assignment synchronized runnable

我很好奇,如果紧跟在这样的值赋值命令之后:

a = 5;

有保证新值已存储到变量中吗?如果原始数据类型和其他数据类型不同?特别是使用Runnable对象。

我在MyClass中运行了包含以下内容的方法:

synchronized(this){ 
    while(pleaseWait){ 
        try { System.out.println("sleeping"); wait();} 
        catch (Exception e) {        e.printStackTrace(); } 
    }  
}

是我调用方法sleepMe()的其他类,其中包含:

synchronized (myclass){
            myclass.pleaseWait = true;
            myclass.notify();
}

问题是,在调用sleepMe之后是否必须插入等待,因此MyClass的实例有时间更改myclass.pleaseWait的值?

我有几个set方法,我将复杂对象(对象的对象)分配给MyClass的实例。

由于

1 个答案:

答案 0 :(得分:1)

两个线程在同一个对象上进行同步的事实意味着当一个线程从pleaseWait调用返回时,另一个线程对wait()所做的更改是可见的。同步(在这种情况下,当您从this调用返回时重新获得wait()上的锁定)提供了两个线程之间所需的“之前发生”关系,以确保更新可见。 / p>

所以回答你的问题:

  • 任何解决方案都需要一个线程在某种意义上“等待”。这是问题所固有的。

  • 你在做什么就足够了。您无需添加额外的等待。等待/通知机制确保执行wait()的线程将看到变量的最新副本...前提是所有更改都是在保持该对象锁定的情况下进行的。

  • 您还可以使用更高级别的并发类来实现此类事情。

  • 您也可以使用volatile和“忙碌的等待”来实现这一点......但这将是一个非常糟糕的想法。