public class J_Test implements Runnable
{
int m_x,m_y;
public void mb_setX(int i)
{
m_x=i;
}
public void mb_setY(int i)
{
m_y=i;
}
public synchronized void mb_setXY(int i)
{
mb_setX(i);
mb_setY(i);
}
public void run()
{
for(int i=0; i>=0;i++)
{
mb_setXY(i);
if(m_x!=m_y) System.out.println(m_x+"!"+m_y);
}
}
public static void main(String args[])
{
J_Test s=new J_Test();
Thread t1=new Thread(s);
Thread t2=new Thread(s);
t1.start();t2.start();
}
}
请问各位:这道题的结果为何会输出一些带不等号的结果?synchronized void mb_setXY这个方法不是被加上锁了吗?

解决方案 »

  1.   

    我试过了,没有输出带不等号的结果。
    synchronized void mb_setXY这个方法确实是被加锁了,所以里面的数据会被保护。但是输出顺序会打乱,因为可能t1线程执行一定时间片后,mb_setXY方法被t2线程抢去执行,待t2执行一定时间片后该方法又可能被t1抢走。但是里面的数据还是安全的。
    你可以在你的if语句后再加else
    {
    System.out.println(this.m_x + "=" + this.m_y);
    }测试。
      

  2.   

    楼主没有理解synchronized
    你给的代码没有使用到synchronized的意义,你把它去掉结果是一样的
    因为你启用的2个线程,他们自身的xy是独立的,绝对不会被另外一个影响到
    出现!=的情况原因,是因为一个线程的mb_setXY()在执行的时候被另一个线程抢去了执行权,而导致自身的x,y的一次输出不同,实际还是相同的。
    这个现象就直接说明,这里的方法mb_setXY在2个线程中都有独立的内存,synchronized不能起到作用其实,这个代码并没有给线程类传值,而且是用了for循环,for中的i很明显只在for循环中有效,怎么可能被其他的线程影响
      

  3.   

    给楼主一段简单的参考代码,锁机制是当2个线程使用同一个资源的时候才起作用public class ThreadEX1 
    {
    public static int num=0;
    public static void main(String[] args) 
    {
    ThreadEX1 n = new ThreadEX1();
    aaa x1=new aaa(n);
    aaa x2=new aaa(n);
    x1.start();
    x2.start();
    }
    }class aaa extends Thread
    {

    public aaa(ThreadEX1 n){
    this.n=n;
    }
    public ThreadEX1 n; public void run(){

    while(n.num<=10){
    synchronized(n){
    System.out.println(Thread.currentThread().getName()+":"+n.num);
    n.num++;
    n.notify();
    try{
    Thread.sleep(500);
    if(n.num<10){
          n.wait();
    }
    }catch(Exception e){ }

    }


    }
    }


    }
      

  4.   

    你好gao11811!谢谢你为我解释了这个关于初学者关于:线程中同步的问题,可我想发很久,不太明白这段话的意思“你给的代码没有使用到synchronized的意义,你把它去掉结果是一样的 
    因为你启用的2个线程,他们自身的xy是独立的,绝对不会被另外一个影响到 
    出现!=的情况原因,是因为一个线程的mb_setXY()在执行的时候被另一个线程抢去了执行权,而导致自身的x,y的一次输出不同,实际还是相同的。 
    这个现象就直接说明,这里的方法mb_setXY在2个线程中都有独立的内存,synchronized不能起到作用 其实,这个代码并没有给线程类传值,而且是用了for循环,for中的i很明显只在for循环中有效,怎么可能被其他的线程影响 ”你给我看的例程我能看明白你的意思,请你能再帮我把这句话讲的浅显些吗?我刚学JAVA,挺笨的,谢谢你啊