[英]Synchronize data between many threads
我是同步主题的新手,在尝试访问同步对象时,我找不到任何有关使用wait()
, notify()
和notifyAll()
方法的明确信息。 例如,如果我们有这样的代码:
class X extends Thread {
int x;
public void methodX()
{
synchronized(this)
{
//some operations on x
}
}
}
class Y extends Thread {
public void methodY(X x)
{
int z = x.x;
}
}
我们应该调用wait()
在methodY()
和notify()
在结束methodX()
否则,我们将不会为z
分配任何值,否则线程将在不显式调用wait()
情况下wait()
直到X解锁为止。
因此,假设您需要methodY
等到methodX
执行methodX
,一种有效的方法是wait
和notify
或notifyAll
。 当然,还有其他多种方法,但其中一种是有效的。 鉴于您甚至可能不需要同步块。
void methodX(){
// do your work here
this.notifyAll();
}
void methodY(X x){
x.wait();
int x = X.x;
}
您可能考虑将阻塞代码放入X
的getX
方法中,但是上述方法在IF起作用(并且这是BIG IF)时,您可以保证methodY
在methodX
之前启动,因为否则, methodY
将丢失notify
调用。
综上所述,我同意JB Nizet
,您可以考虑使用更高级的机制,例如Semaphore / Mutex /等。这些机制可以简化复杂性。 例如,如果您使用CountDownLatch
并以1计数创建它,则您的代码可能会更健壮...
考虑:
class X{
volatile int x;
final CountDownLatch cdl = new CountDownLatch(1);
void methodX(){
// do work here
cdl.countDown();
}
int getX(){
cdl.await();
return x;
}
}
class Y{
void methodY(X x){
int z = X.getX();
}
}
以上内容将每次都有效,没有任何订购风险。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.