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