我很好奇,如果紧跟在这样的值赋值命令之后:
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的实例。
由于
答案 0 :(得分:1)
两个线程在同一个对象上进行同步的事实意味着当一个线程从pleaseWait
调用返回时,另一个线程对wait()
所做的更改是可见的。同步(在这种情况下,当您从this
调用返回时重新获得wait()
上的锁定)提供了两个线程之间所需的“之前发生”关系,以确保更新可见。 / p>
所以回答你的问题:
任何解决方案都需要一个线程在某种意义上“等待”。这是问题所固有的。
你在做什么就足够了。您无需添加额外的等待。等待/通知机制确保执行wait()
的线程将看到变量的最新副本...前提是所有更改都是在保持该对象锁定的情况下进行的。
您还可以使用更高级别的并发类来实现此类事情。
您也可以使用volatile
和“忙碌的等待”来实现这一点......但这将是一个非常糟糕的想法。