我先贴上代码,再问问题
public class Test{
public static void main(String[] agrs){
//Timer timer = new Timer();
TestSync test1 = new TestSync(new Timer());
TestSync test2 = new TestSync(new Timer());
System.out.println(test1 == test2);
Thread t1 = new Thread(test1);
Thread t2 = new Thread(test2);
t1.setName("t1");
t2.setName("t2");
System.out.println(t1.getId()+" "+t2.getId());
t1.start();
t2.start();
}
}class TestSync implements Runnable {
Timer t;
TestSync(Timer t){
this.t = t;
}
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的线程");
//}
}
}
这里的
TestSync test1 = new TestSync(new Timer());
TestSync test2 = new TestSync(new Timer());
的参数如果换上前面的Timer timer = new Timer();结果就大不一样,我不知道这个构造参数是怎么影响这个结果的呢?请知道的说说两个结果分别都是怎么来的,谢谢了
public class Test{
public static void main(String[] agrs){
//Timer timer = new Timer();
TestSync test1 = new TestSync(new Timer());
TestSync test2 = new TestSync(new Timer());
System.out.println(test1 == test2);
Thread t1 = new Thread(test1);
Thread t2 = new Thread(test2);
t1.setName("t1");
t2.setName("t2");
System.out.println(t1.getId()+" "+t2.getId());
t1.start();
t2.start();
}
}class TestSync implements Runnable {
Timer t;
TestSync(Timer t){
this.t = t;
}
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的线程");
//}
}
}
这里的
TestSync test1 = new TestSync(new Timer());
TestSync test2 = new TestSync(new Timer());
的参数如果换上前面的Timer timer = new Timer();结果就大不一样,我不知道这个构造参数是怎么影响这个结果的呢?请知道的说说两个结果分别都是怎么来的,谢谢了
这个是使add()方法同步的,既只能同时有一个线程操作add方法
TestSync test1 = new TestSync(new Timer());
TestSync test2 = new TestSync(new Timer());
Timer类中的aynchronized没有起到作用,两个进程都可以同时调用add(String name)方法。
由于
private static int num = 0;
表示num这个变量为所有Timer类的实例共享,当有一个线程得到CPU运行时而被JVM调用run方法来启动后(可能是test1也有可能是test2,这里假设是test1),接着test1调用add方法,num加1,变成num=1,这时test1休眠1秒,这1秒中,test2也启动了并调用add方法,由于num是共享的,所以num在test2调用add方法之前的值就为1,num++之后,num=2,所以test1和test2都是第2个使用timer的线程第二种情况:
Timer timer = new Timer();
TestSync test1 = new TestSync(timer );
TestSync test2 = new TestSync(timer );
表示这两个线程共享同一个资源(timer ),aynchronized在这里起到同步的作用,也就是在同一时间内只能由一个线程调用add方法,假设是test1先启动,test2就必须等test1调用完add方法之后才能调用add方法,所以第一个进来的num=1,第二个进来的num=2