首先根据网上demo 定义了Synchronized 的代码块。基础类如下:
/** * @author sunlei * @create 2018/6/14 * @Describe */ public class SynchThread implements Runnable{ private final int i=0; private static int count=0; ReentrantLock reentrantLock; public SynchThread(Object object){ reentrantLock=new ReentrantLock(); } public int getCount() { return count; } @Override public void run() { synchronized (this){ for(int i=0;i<20;i++){ //reentrantLock.lock(); Log.d("result",Thread.currentThread().getName()+"---"+count++); // reentrantLock.unlock(); }} } }
main 方法如下:
SynchThread synchThread1=new SynchThread(b); Thread t1=new Thread(synchThread1,"1号"); Thread t3=new Thread(synchThread1,"3号"); Thread t2=new Thread(synchThread1,"2号"); t1.start(); t2.start(); t3.start();
执行结果如下:
06-14 18:34:21.826 14626-14672/com.example.sunlei.demo D/result: 1号---0
1号---1
1号---2
1号---3
1号---4
1号---5
1号---6
1号---7
1号---8
1号---9
1号---10
1号---11
1号---12
1号---13
1号---14
1号---15
1号---16
1号---17
1号---18
1号---19
06-14 18:34:21.827 14626-14674/com.example.sunlei.demo D/result: 3号---20
3号---21
3号---22
3号---23
3号---24
3号---25
3号---26
3号---27
3号---28
3号---29
3号---30
3号---31
3号---32
3号---33
3号---34
3号---35
3号---36
3号---37
3号---38
3号---39
06-14 18:34:21.827 14626-14673/com.example.sunlei.demo D/result: 2号---40
06-14 18:34:21.828 14626-14673/com.example.sunlei.demo D/result: 2号---41
2号---42
2号---43
2号---44
2号---45
2号---46
2号---47
2号---48
2号---49
2号---50
2号---51
2号---52
2号---53
2号---54
2号---55
2号---56
2号---57
2号---58
2号---59
06-14 18:34:21.838 14626-14626/com.example.sunlei.demo D/result: onresume
发现 每个线程都是自己执行完了 才放开锁。。但是我要是希望3个线程 一起执行。。怎么处理》?
修改 SynchThread 类:
/** * @author sunlei * @create 2018/6/14 * @Describe */ public class SynchThread implements Runnable{ private final int i=0; private static int count=0; ReentrantLock reentrantLock; public SynchThread(Object object){ reentrantLock=new ReentrantLock(); } public int getCount() { return count; } @Override public void run() { //synchronized (this){ for(int i=0;i<20;i++){ reentrantLock.lock(); Log.d("result",Thread.currentThread().getName()+"---"+count++); reentrantLock.unlock(); }} // } }
修改 为重入锁。。那么再次执行:
06-14 19:04:38.976 17662-17706/com.example.sunlei.demo D/result: 1号---0
1号---1
06-14 19:04:38.977 17662-17706/com.example.sunlei.demo D/result: 1号---2
1号---3
1号---4
1号---5
1号---6
1号---7
1号---8
06-14 19:04:38.977 17662-17708/com.example.sunlei.demo D/result: 3号---9
3号---10
3号---11
3号---12
3号---13
3号---14
3号---15
3号---16
3号---17
3号---18
06-14 19:04:38.978 17662-17708/com.example.sunlei.demo D/result: 3号---19
3号---20
3号---21
3号---22
3号---23
3号---24
3号---25
3号---26
3号---27
3号---28
06-14 19:04:38.978 17662-17707/com.example.sunlei.demo D/result: 2号---29
2号---30
2号---31
2号---32
2号---33
2号---34
2号---35
2号---36
06-14 19:04:38.979 17662-17707/com.example.sunlei.demo D/result: 2号---37
2号---38
2号---39
2号---40
2号---41
2号---42
2号---43
2号---44
2号---45
2号---46
2号---47
2号---48
06-14 19:04:38.979 17662-17706/com.example.sunlei.demo D/result: 1号---49
1号---50
1号---51
1号---52
1号---53
1号---54
1号---55
1号---56
1号---57
1号---58
06-14 19:04:38.979 17662-17706/com.example.sunlei.demo D/result: 1号---59
06-14 19:04:38.994 17662-17662/com.example.sunlei.demo D/result: onresume
发现他们是穿插执行的。算是一起执行了