public class TestSync implements Runnable {
Timer t = new Timer();
public static void main(String[] args) {
TestSync ts1 = new TestSync();
TestSync ts2 = new TestSync();
Thread t1 = new Thread(ts1);
Thread t2 = new Thread(ts2);
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
// TODO Auto-generated method stub }
public void run(){
t.add(Thread.currentThread().getName());
}}class Timer{
private static int num = 0;
public synchronized void add(String name){
//synchronized (this){
num ++;
try{
Thread.sleep(1);
}catch(InterruptedException e){}
System.out.println(name + ",你是第" + num + "个使用timer线程");
}
//}
}调试2次,每次结果竟然是不一样的?这是为啥子嘛?????
第一次是这样滴:
t1,你是第2个使用timer线程
t2,你是第2个使用timer线程
第二次是这样滴:t2,你是第2个使用timer线程
t1,你是第2个使用timer线程
都是第二个使用timer线程,不应该的呀,应该一个第一个使用,一个第二个使用啊!!!!!!!!
一个进程进行完了另一个才能进行啊!!!
对成员函数做synchronized,必须是同一个对象才会有互斥访问的效果。你的代码中:
TestSync ts1 = new TestSync();
TestSync ts2 = new TestSync();
明显是两个不同的对象,各自锁各自的,互不影响。
Timer t = new Timer(); 是个成员变量,每个实例都有一个。static Timer t = new Timer(); 是个类静态变量,所有实例共用一个。也就是改为static后,不管你new多少个TestSync()实例,Timer始终只有一个,那么add()也就是同一个了。
类似的,你还可以只把add()函数改为 static 的。