public class SyncTest {
private int x;
private int y;
private synchronized void setX(int i){ x = i; }
private synchronized void setY(int i){ y = i; }
public void setXY(int i){setX(i);setY(i);}
public synchronized boolean check(){return x!=y;} //如果保证这个程序返回值为true;
}
我觉得非常难以保证的。
private int x;
private int y;
private synchronized void setX(int i){ x = i; }
private synchronized void setY(int i){ y = i; }
public void setXY(int i){setX(i);setY(i);}
public synchronized boolean check(){return x!=y;} //如果保证这个程序返回值为true;
}
我觉得非常难以保证的。
setX和setY即使是线程安全的,但set同样的值,也会为false。
让你的主程序,一直执行check()方法,类似实时监控.
然后,实行setXY()方法,如果足够巧合,可能会出现true的情况。
我们把微观的实行情况放大一下,
实行的顺序就是:
setXY()方法 -〉check() -〉setX() -〉check() -〉setY() -〉check()
个人意见,仅供参考。
其实setXY()不对造成影响,主要是其他线程单独为x和y设置时存在问题。。
如果你check以前,调用
setXY(),而期间没有其他线程调用setX或者是setY,那返回的就是true
private SyncTest st = new SyncTest();
private class Threada extends Thread{
public void run(){
while(!st.check()){
st.setXY(1);
System.out.println(st.check());
}
}
} private class Threadb extends Thread{
public void run(){
while(!st.check()){
st.setXY(2);
System.out.println(st.check());
}
}
}
private class Threadc extends Thread{
public void run(){
while(!st.check()){
st.setXY(3);
System.out.println(st.check());
}
}
}
private class Threadd extends Thread{
public void run(){
while(!st.check()){
st.setXY(4);
System.out.println(st.check());
}
}
}
private class Threade extends Thread{
public void run(){
while(!st.check()){
st.setXY(5);
System.out.println(st.check());
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestThread tt = new TestThread();
tt.new Threada().start();
tt.new Threadb().start();
tt.new Threadc().start();
tt.new Threadd().start();
tt.new Threade().start();
}}
祝大家虎年大运。
顺便大家再接着讨论我的贴子。
多个线程同时调用时,第一个线程在setxy刚完毕,没来得及check,另一个程序又重新setx,在另一个程序setx完毕后,正好执行check程序,此时的x已经改变为第二次执行后的x了(第一次的x已经被覆盖),所以x!=y