尝试在2个线程之间发出信号,浪费的信号最少。 由于我已经尝试了一段时间 - 请提出错误/改进(如果有的话)。 目的是: 没有死锁 2.没有被阅读错过的更新 3.尽量不要提高错过的信号。
import java.util.Random;
class shareful{
class share{
int sharedata;
volatile boolean isbitset=false;
public int getstats(){
return sharedata;
}
public void setstats(int data){
sharedata=data;
}
public boolean getbitset(){ return isbitset;}
public void setbitset(boolean flag){ isbitset=flag;}
}
share so=new share();
void runStatistics(){
int check=0;
Thread t1=new Thread(new Runnable(){
public void run(){
Random r=new Random();
boolean isflagged=false;
while (true){
synchronized(so){
try{
while(so.getbitset()==true){
so.wait();
}
}
catch(InterruptedException e){}
so.setstats(r.nextInt(200));
if(so.getbitset()==false) isflagged=true;
so.setbitset(true);
if(isflagged) so.notify();
}
}
}
});
Thread t2=new Thread(new Runnable(){
public void run(){
boolean isflagged=false;
while(true){
synchronized(so){
try{
while(so.getbitset()==false){
so.wait();
}
}
catch(InterruptedException e){}
int curr=so.getstats();
if(so.getbitset()==true) isflagged=true;
so.setbitset(false);
if(isflagged) so.notify();
}
}
}
});
t1.start();
t2.start();
}
public static void main(String[] args){
shareful s=new shareful();
s.runStatistics();
}
}
答案 0 :(得分:1)
有效性的建议(或反向健全,取决于您的观点):
其他建议:阅读Brian Goetz的“Java Concurrency in Practice”,发现在特定应用程序中不应尝试在此级别编写代码。