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

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

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

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

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í)行結果如下:

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

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

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

相關文章

最新評論

宁夏| 佛坪县| 咸阳市| 麻江县| 潍坊市| 霍城县| 舒兰市| 大竹县| 红桥区| 中方县| 西乌| 蛟河市| 宜黄县| 博湖县| 密云县| 仙桃市| 津市市| 宜良县| 庄浪县| 满城县| 绍兴县| 公安县| 西安市| 梁河县| 增城市| 河间市| 鸡西市| 时尚| 静海县| 敦煌市| 桂阳县| 惠安县| 青冈县| 武川县| 保山市| 德兴市| 定兴县| 岚皋县| 定结县| 双牌县| 江城|