程序:
public class TestSynchronized
{
public static void main(String[] args)
{
Runner r = new Runner();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.setName("T-1");
t2.setName("T-2");
t1.start();
t2.start();
}
}class Runner implements Runnable
{
public void run()
{
Timer t = new Timer();
t.MethodF(Thread.currentThread().getName());
}
}class Timer 
{
private static int num = 0;
public synchronized void MethodF(String name)
{
num++;
try{Thread.sleep(10);}
catch(InterruptedException e){}
  System.out.println(name+":你是第"+num+"个使用者");
}
}
我的本意是要输出这个结果:
T-1:你是第1个使用者
T-2:你是第2个使用者
可实际结果却是:
T-1:你是第2个使用者
T-2:你是第2个使用者
在这个程序里我特意加了sleep方法,就是想确定一下synchronized的锁定作用,可是结果却没有锁。我错在哪了啊?

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【dzh523】截止到2008-06-29 19:34:09的历史汇总数据(不包括此帖):
    发帖数:0                  发帖分:0                  
    结贴数:0                  结贴分:0                  
    未结数:0                  未结分:0                  
    结贴率:-------------------结分率:-------------------
    如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
      

  2.   

    似乎还是需要用到wait()和notify吧
      

  3.   

    同步方法要两个线程共用一个对象时才起作用!
    在你的程序里虽然只有一个Runner对象,但是在上面new了两个Thread,
    每个Tread都在start的时候调用Runner对象的run方法,两个Runner对象
    的run方法里new了一个Timer对象,调用两次就new了两个出来,一个线程
    用一个,由于没有共用对象,当然没有效果了.首先要保证只有一个Timer
    对象才行.
      

  4.   

    懂了懂了,“同步方法要两个线程共用一个对象时才起作用! ”感谢qusic!
      

  5.   

    同意楼上的
    如果要达到楼主的要求 就需要将方法里面的内容作为类同步
    public void MethodF(String name) {
    synchronized (Timer.class) {
    num++;
    try {
    Thread.sleep(10);
    } catch (InterruptedException e) {
    }
    System.out.println(name + ":你是第" + num + "个使用者");
    }
    }