java学习记录---synchronized

 1 public class TestSync implements Runnable{
 2     Timer timer = new Timer();
 3     public static void main(String args[]){
 4         TestSync test = new TestSync();
 5         Thread t1 = new Thread(test);
 6         Thread t2 = new Thread(test);
 7         t1.setName("t1");
 8         t2.setName("t2");
 9         t1.start();
10         t2.start();
11     }
12     public void run(){
13         timer.add(Thread.currentThread().getName());
14     }
15 }
16 
17 class Timer{
18     static int num = 0;
19     public void add(String name){
20         synchronized(this){
21             num++;
22             try{
23                 Thread.sleep(1);
24             }catch(InterruptedException e){}
25             System.out.println(name+",你是第"+num+"个使用timer的线程");
26         }
27     }
28 }

得到的结果为:

t1,你是第1个使用timer的线程

t2,你是第2个使用timer的线程

 

自己的仿照的代码

 1 public class TestSync{
 2     
 3     public static void main(String args[]){
 4         Runner3 ts1 = new Runner3();
 5         Runner3 ts2 = new Runner3();
 6         Thread t1 = new Thread(ts1);
 7         Thread t2 = new Thread(ts2);
 8         t1.setName("t1");
 9         t2.setName("t2");
10         t1.start();
11         t2.start();
12     }
13 }
14 
15 class Runner3 implements Runnable{
16     Timer timer = new Timer();
17     static int num = 0;
18     public void run(){
19         synchronized(this){
20             num++;
21             try{
22                 Thread.sleep(1);
23             }catch(InterruptedException e){}
24             System.out.println(Thread.currentThread().getName()+",你是第"+num+"个使用timer的线程");
25         }
26     }
27 }

这样运行的结果是:

t1,你是第2个使用timer的线程

t2,你是第2个使用timer的线程

观察马老师的代码,发现在实现Runnable接口后,只new了一个新的对象test(TestSync test = new TestSync();),然后将同一个test传入Thread()中,如果按照我自己的来运行相当于new了两个线程,让两个并发线程调用同一个run()方法.所以要想得到代码一的结果,将

Runner3 ts1 = new Runner3();
Runner3 ts2 = new Runner3();
Thread t1 = new Thread(ts1);
Thread t2 = new Thread(ts2);
改为
Runner3 ts = new Runner3()
Thread t1 = new Thread(ts);
Thread t2 = new Thread(ts);
即可.

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。