gpt4 book ai didi

java - 在多个线程之间同步数据

转载 作者:行者123 更新时间:2023-11-30 04:23:24 25 4
gpt4 key购买 nike

我是同步主题的新手,在任何地方都找不到有关使用 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()直到 X 解锁?

最佳答案

所以给你需要的methodY等到methodX已执行,执行此操作的一种有效方法是 waitnotifynotifyAll 。当然还有多种其他方法,但其中一种是有效的。鉴于您可能甚至不需要同步块(synchronized block)。

void methodX(){
// do your work here
this.notifyAll();
}

void methodY(X x){
x.wait();
int x = X.x;
}

您可以考虑将阻止代码放在 getXX中的方法但如果(这是一个很大的如果)你可以保证 methodY ,上面的方法就可以工作。早于 methodX 开始因为否则methodY会错过notify称呼。

以上所述,我同意JB Nizet ,您可能会考虑更高级的机制,例如信号量/互斥体/等。这些可以减轻复杂性。例如,如果您使用 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();
}
}

上述内容每次都有效,没有任何订购风险。

关于java - 在多个线程之间同步数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16440549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com