gpt4 book ai didi

java - 尽管使用了同步,wait()和notify()仍然不可靠吗?

转载 作者:行者123 更新时间:2023-12-01 07:27:47 26 4
gpt4 key购买 nike

我最近发现使用同步并不能防止任何死锁。

例如在此代码中:

ArrayList <Job> task;
...

public void do(Job job){
synchronized(tasks){
tasks.add(job);
}
synchronized(this){
notify();
}
}

public void run(){
while(true){
for (int = 0;i<tasks.size();i++){
synchronized(tasks){
Job job = tasks.get(i);
}
//do some job here...
}
synchronized(this){
wait(); //lock will be lost...
notifier = false; //lock will be acquired again after notify()
}
}
}

现在,问题出在哪里?好吧,如果正在运行的线程没有等待,他将看不到任何通知(即notify()调用),因此他可能会遇到死锁并且无法处理他收到的任务! (或者他可能处理得太晚了......)

因此我实现了这段代码:

private volatile boolean notifier = false;
ArrayList <Job> task;
...

public void do(Job job){
synchronized(tasks){
tasks.add(job);
}
synchronized(this){
notifier = true;
notify();
}
}

public void run(){
while(true){
for (int = 0;i<tasks.size();i++){
synchronized(tasks){
Job job = tasks.get(i);
}
//do some job here...
}
synchronized(this){
if(!notifier){
wait(); //lock will be lost...
notifier = false; //lock will be acquired again after notify()
}
}
}
}

这是正确的还是我遗漏了什么?可以更容易地完成吗?

最佳答案

Now, what is the problem? Well, if the running thread isn't waiting, he won't see any notifications (i.e. notify() calls), therefore he may run into a dead lock and not handle the tasks he received!

对。这不是“不可靠”的情况,而是语言定义的情况。 notify() 调用不会对通知进行排队。如果没有线程在等待,则 notify() 实际上不会执行任何操作。

can it be done easier?

是的。我会考虑使用 BlockingQueue -- a LinkedBlockingQueue应该适合你。一个线程调用从队列中提取,另一个线程可以添加到队列中。它将为您处理锁定和信号发送。一旦开始使用,您应该能够删除大部分手写代码。

关于java - 尽管使用了同步,wait()和notify()仍然不可靠吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21439355/

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