请问class Runner里的run方法synchronized怎么不起作用????运行起来还是输出“t1第2个访问者t2第2个访问者”。
我想让他输出“t1第1个访问者t2第2个访问者”。public class TestSync{
public static void main(String[] args){
Runner t1 = new Runner();
Runner t2 = new Runner();
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}
}class Runner extends Thread{
static int num;
public void run(){
synchronized(this){
num++;
try{
Thread.sleep(1);
}catch(InterruptedException e){}
System.out.println(getName()+"第"+num+"个访问者");
}
}
}

解决方案 »

  1.   

    synchronized(this) 锁定的是各实例本身,没有形成互斥class Runner extends Thread {
    static int num;
    private static Object lock = new Object();
    public void run() {
    synchronized (lock) { // 锁定公用资源,才能形成互斥
    num++;
    try {
    Thread.sleep(1);
    } catch(InterruptedException e) { }
    System.out.println(getName()+"第"+num+"个访问者");
    }
    }
    }
      

  2.   


    请问这句话是什么意思?private static Object lock = new Object();
      

  3.   


    请确认下:
    1, 代码没抄错
    2, JRE 没有傻掉
      

  4.   

    这代码是正确的,synchronized (this)表示只有该类的对象线程才能执行,但是你new了两个都是该类的对象,你锁住的是类而不是对象