最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Lock鎖多線程中實現(xiàn)流水線任務(wù)

 更新時間:2020年05月01日 12:30:54   作者:DescribeMe  
這篇文章主要介紹了Java Lock鎖多線程中實現(xiàn)流水線任務(wù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

  下面程序代碼通過使用Lock鎖執(zhí)行簡單的流水線任務(wù):

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author lzq
 * @data 2020/4/29 0029 - 下午 9:48
 */
public class TestLock {
  public static void main(String[] args) {
    DataSource dataSource=new DataSource();
    new Thread(() -> {
      for (int i=0;i<10;i++){
        dataSource.a();
      }
    },"A").start();

    new Thread(() -> {
      for (int i=0;i<10;i++){
        dataSource.b();
      }
    },"B").start();

    new Thread(() -> {
      for (int i=0;i<10;i++){
        dataSource.c();
      }
    },"C").start();
  }
}

class DataSource{
  private int x=1;
  private Lock lock=new ReentrantLock();
  private Condition condition1=lock.newCondition();
  private Condition condition2=lock.newCondition();
  private Condition condition3=lock.newCondition();

  public void a(){
    lock.lock();
    try {
      while(x!=1){
        condition1.await();
      }
      System.out.println(Thread.currentThread().getName()+":aaa");
      x=2;
      condition2.signal();
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
  public void b(){
    lock.lock();
    try {
      while(x!=2){
        condition2.await();
      }
      System.out.println(Thread.currentThread().getName()+":bbb");
      x=3;
      condition3.signal();
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
  public void c(){
    lock.lock();
    try {
      while(x!=3){
        condition3.await();
      }
      System.out.println(Thread.currentThread().getName()+":ccc");
      x=1;
      condition1.signal();
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
}

    執(zhí)行結(jié)果如下:

對于上面代碼簡單分析:代碼中包含簡單的生產(chǎn)者消費者流程和Lock實現(xiàn)三部曲,即重復判斷條件,執(zhí)行邏輯,喚醒其他線程和產(chǎn)生鎖,加鎖,解鎖。注意這里一點,條件判斷一定要重復判斷,不然可能會導致線程假醒影響結(jié)果。

因為當線程處于等待狀態(tài)時,線程會釋放資源,等到被喚醒的時候,從上次await的地方醒來繼續(xù)執(zhí)行,這時條件判斷成立,執(zhí)行await,其他線程再修改條件使得本線程被喚醒,此時本線程不會繼續(xù)判斷,而是繼續(xù)執(zhí)行,如果使用循環(huán)判斷就能檢驗出條件被修改。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

洛宁县| 宿州市| 固始县| 奉化市| 永丰县| 福海县| 云安县| 东阳市| 武强县| 寻乌县| 凤山县| 新巴尔虎左旗| 葵青区| 忻州市| 沭阳县| 双城市| 上林县| 美姑县| 开平市| 芦山县| 留坝县| 历史| 阳谷县| 玛曲县| 仲巴县| 宾阳县| 鹤山市| 铜山县| 陵川县| 甘孜县| 松原市| 当雄县| 上饶县| 肃南| 揭阳市| 新兴县| 灵寿县| 罗江县| 南陵县| 卢龙县| 金乡县|