下面的程序是一个简单的线程程序。由于某种我无法想象的原因,它在两个线程中同时陷入了生产()和消费()方法的无限循环中。
它产生几次输出,然后在控制台上没有输出。所以我认为它陷入了循环。
我的问题是,由于循环取决于valueSetItem 类的同一对象的标志值,valueSet因此不能同时为真和假。因此,produce() 或 cosume() 方法的循环都应该为 false,并且输出的打印应该继续。
但这里不会发生这种情况。那么,如果条件取决于一次只能取真或假的标志变量,为什么它会卡在 while 循环中呢?
class Item{
boolean valueSet = false ;
int item = 0 ;
public void consume(){
while(!valueSet) ;
System.out.println("Consumed : " + item ) ;
valueSet = false ;
}
public void produce(int n ){
while(valueSet);
item = n ;
System.out.println("Produced : " + item ) ;
valueSet = true ;
}
}
class Producer implements Runnable{
Item item ;
Producer(Item itemobj){
item = itemobj ;
}
public void run(){
while(true){
System.out.println("\nProducing ....") ;
item.produce((int)Math.random()*100) ;
}
}
}
class Consumer implements Runnable{
Item item ;
Consumer(Item itemobj){item = itemobj ; }
public void run(){
while(true){
System.out.println("\nConsuming !") ;
item.consume() ;
}
}
}
class Main{
public static void main(String[] args) {
Item item = new Item() ;
Thread consumer = new Thread(new Consumer(item)) ;
Thread producer = new Thread(new Producer(item)) ;
System.out.println("\nStarted producer and consumer threads : ") ;
consumer.start() ;
producer.start() ;
}
}
更新 :
当while(valueSet)一个线程卡在无限循环中时,不应该while(!valuSet)跳出循环并翻转valueSet? 这会反过来导致while(valueSet)跳出循环吗?
根据某些答案,似乎在while(valueSet)卡住时,另一个线程以某种方式无法访问valueSet。我不明白这是怎么回事。请解释你的答案。
我看到使用volatileforvalueSet会修复它,但我无法理解如何不使用它。即使它依赖于一个valueSet不能同时为真和假的标志,它也会导致无限循环。
噜噜哒
阿晨1998
桃花长相依
相关分类