【发布时间】:2018-05-12 18:33:28
【问题描述】:
我希望我可以理解地描述这种情况。 我想启动一些线程,它们都将执行一个同步方法。考虑第一个线程在此方法中检查变量的值,然后在检查后释放锁。然后第二个线程调用相同的函数。但是第一个线程将(在几毫秒后)修改这个在另一个类中的变量,但第二个线程将(可能)在第一个更改变量之前检查该变量。如何强制第二个线程等待(不休眠),直到第一个线程完成并在第二个线程检查值之前更改变量?第一个可以发送一些信号,例如“变量已更改,您现在可以检查一下”吗?
现在我尝试在代码中写这个:线程启动全部执行此操作:
abstract class Animal {
protected House house;
abstract boolean eating();
@Override
public void run() {
try {
while(!Thread.interrupted()) {
if(eating()) {
goEat();//here house.eatingRoom.count will be changed
Thread.sleep(1000);
goback();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
他们都访问这个方法:
class Cat extends Animal {
@Override
synchronized boolean eating() {
if (house.eatingRoom.count == 0)
return true;//first thread release lock and 2 thread access it but the value is not changed yet
else
return false;
}
}
还有:
class EatingRoom {
final Set<Animal> count = new HashSet<>();
synchronized void add(Cat c) {
count.add(c);
}
}
完成:
public class House extends Thread {
final EatingRoom eatingRoom = new EatingRoom();
//start all threads here so run in Animal class is executed..
}
【问题讨论】:
-
这段代码看起来不正确。
EatingRoom类有一个count类型的成员变量Set<Animal>并且您的Cat类具有以下逻辑if (house.eatingRoom.count == 0)。 idownvotedbecau.se/nomcve
标签: java multithreading synchronized