线程同步出现问题,大神帮忙看下,谢谢了!

代码如下:
package myss1;

public class TestSynchronized {

public static void main(String[] args) {
        D d1=new D();
        D d2=new D();
        d1.setName("d1");
        d2.setName("d2");
        d1.start();
        d2.start();
}

}
class D extends Thread{
private static int num=0;
public void run(){
synchronized (this){
num++;
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName()+" "+num);
}

}

}

我预想的输出结果是:
d1 1
d2 2
可是输出结构是:
d1 2
d2 2

为什么啊,我明明锁住了那段代码了啊!

你没有理解同步锁的概念,在你
synchronized(this){

}
里面,这个this必须是同一个对象才能锁住那段代码。
由于你两个对象都是new出来的,所以等同于,d1线程执行的代码是
synchronized(d1){
...
}
d2线程执行的代码是
synchronized(d2){
...
}
两个锁住的不是一个对象,所以不能达到你预期的效果

解决方法可以用类锁
synchronized(D.class){
...
}
或者用同一个对象
class D extends Thread{
private static Object obj = new Object();
public void run(){
synchronized(obj){
...
}
}
}

这样写:

 package com.lin;

public class TestSynchronized {

    public static void main(String[] args) {
        D d1 = new D();
        D d2 = new D();
        d1.setName("d1");
        d2.setName("d2");
        d1.start();
        d2.start();
    }

}

class D extends Thread {
    private static int num = 0;

    private static Object obj =  new Object();

    public void run() {
        synchronized (obj) {
            num++;
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(getName() + " " + num);
        }
    }
}

结果如下:
图片说明