-1

我很好奇是否在像这样的值分配命令之后立即:

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 的实例。

谢谢

4

1 回答 1

1

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

所以回答你的问题:

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

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

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

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

于 2013-05-04T14:23:49.270 回答