代码如下:
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);
}
}
}