关于Synchronized涉及到多线程并发操作的处理

首先根据网上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

发现他们是穿插执行的。算是一起执行了




阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页