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;
}
我觉得非常难以保证的。

解决方案 »

  1.   

    不知道楼主啥意思。为什么要保证x!=y。
    setX和setY即使是线程安全的,但set同样的值,也会为false。
      

  2.   

    其他类调用SetXY(i)时,x,y,i值相同,x!=y是返回false;
      

  3.   

    答案说多个线程同时调用setXY()必会返回true
      

  4.   

    个人认为可能实现:
    让你的主程序,一直执行check()方法,类似实时监控.
    然后,实行setXY()方法,如果足够巧合,可能会出现true的情况。
    我们把微观的实行情况放大一下,
    实行的顺序就是:
    setXY()方法 -〉check() -〉setX() -〉check() -〉setY()  -〉check() 
    个人意见,仅供参考。
      

  5.   

    我也觉得楼主是多线程这个意思。。
    其实setXY()不对造成影响,主要是其他线程单独为x和y设置时存在问题。。
    如果你check以前,调用
    setXY(),而期间没有其他线程调用setX或者是setY,那返回的就是true
      

  6.   

    答案肯定错误了,写了个多线程同时调用,还是false。
      

  7.   

    这个东西的不确定性很大,在启动的线程数<=所有cpu核心数的时候基本上都是返回flase,如果启动的线程数>所有cpu核心数,很快就可能为true的。package test.thread;public class TestThread{
    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();
    }}
      

  8.   

    今天是大年初一,祝CSDN强者愈强,更上一层楼。
    祝大家虎年大运。
    顺便大家再接着讨论我的贴子。
      

  9.   

    如果一个方法的返回值总是为 true,那么这个返回值还有什么意义呢?
      

  10.   

    setX(i);setY(i);在这两句中间加上sleep,然后用多线程来调用就可以了。
      

  11.   

     我想是这样的:
     多个线程同时调用时,第一个线程在setxy刚完毕,没来得及check,另一个程序又重新setx,在另一个程序setx完毕后,正好执行check程序,此时的x已经改变为第二次执行后的x了(第一次的x已经被覆盖),所以x!=y