日期:2014-05-20 浏览次数:21014 次
package cai.thread;
public class TestSynchronize extends Thread {
public static Timer timer = new Timer();
public TestSynchronize(String name) {
super(name);
}
public static void main(String[] arg) {
TestSynchronize t1 = new TestSynchronize("t1");
TestSynchronize t2 = new TestSynchronize("t2");
t1.start();
t2.start();
}
public void run() {
for (int i = 0; i < 5; i++)
timer.add(Thread.currentThread().getName());
}
}
class Timer {
public static int num = 0;
public synchronized void add(String name) {
// synchronized(this) {
num++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + " num: " + num);
// }
}
}
------解决方案--------------------
锁是对象的内存地址
而
TestSynchronize t1 = new TestSynchronize("t1");
TestSynchronize t2 = new TestSynchronize("t2");
创建了两个Timer对象
导致add方法的锁在两个对象上
Timer timer = new Timer();改为静态的就可以了