博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ReentrantLock 和 Condition的使用
阅读量:5086 次
发布时间:2019-06-13

本文共 2709 字,大约阅读时间需要 9 分钟。

ReentrantLock 

ReentrantLock可以等同于synchronized使用

ReentrantLock 类实现了Lock ,它拥有与 synchronized 相同的并发性和内存语义,但是添加了类似锁投票、定时锁等候和可中断锁等候的一些特性。此外,它还提供了在激烈争用情况下更佳的性能。(换句话说,当许多线程都想访问共享资源时,JVM 可以花更少的时候来调度线程,把更多时间用在执行线程上。

Condition 

线程之间的通信。Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用。

 

请看demo:

/**  *   子线程 和  主线程  协助工作  *    *    main  打印一次  *    sub   打印2次  *   * @ClassName: ThreadMutex * @Description: TODO(这里用一句话描述这个类的作用) * @author ZhangWei * @date 2015年8月17日 下午5:24:54 *  */  public class ThreadMutexByThreeThread {      public static void main(String[] args) {      final   Buiness2 b = new Buiness2();       new Thread(){     @Override     public void run() {      for (int i = 1; i <= 50; i++) {        b.sub1();      }     }    }.start();          new Thread(){     @Override     public void run() {      for (int i = 1; i <= 50; i++) {        b.sub2();      }     }    }.start();          for (int i = 1; i <= 50; i++) {      b.main();    }   }    }      class Buiness2{      /**   *   * 1 main  走   * 2 sub1  走   * 3 sub2 走   *   */   private int shouldWho = 0;      private Lock lock = new ReentrantLock();      private  Condition con1 = lock.newCondition();   private  Condition con2 = lock.newCondition();   private  Condition con3 = lock.newCondition();         public  void sub1(){       lock.lock();    try {     while(shouldWho !=1 ){      try {              // this.wait();       con2.await();                    } catch (Exception e) {       e.printStackTrace();      }     }     for (int j = 1; j <= 2; j++) {      System.out.println("sub1 Thread  sequnced:"+j);     }     shouldWho = 2;     con3.signal();    } catch (Exception e) {     e.printStackTrace();    } finally{     lock.unlock();    }   }         public  void sub2(){       lock.lock();    try {     while( shouldWho != 2  ){      try {              // this.wait();       con3.await();                    } catch (Exception e) {       e.printStackTrace();      }     }     for (int j = 1; j <= 2; j++) {      System.out.println("sub2 Thread  sequnced:"+j);     }     shouldWho = 0;     con1.signal();    } catch (Exception e) {     e.printStackTrace();    } finally{     lock.unlock();    }         }         public   void main(){    lock.lock();    try {     while( shouldWho != 0 ){      try {       con1.await();      } catch (Exception e) {       e.printStackTrace();      }     }          for (int j = 1; j <= 1; j++) {      System.out.println("main Thread  sequnced:"+j);     }          shouldWho = 1;     //this.notify();     con2.signal();    } catch (Exception e) {     e.printStackTrace();    } finally{     lock.unlock();    }      }  }

 

转载于:https://www.cnblogs.com/xiarongjin/p/8310385.html

你可能感兴趣的文章
可变集合的方法
查看>>
git移除上一次的commit中误添加的文件
查看>>
CONCATENATION 引发的性能问题
查看>>
coalesce和nvl函数
查看>>
虚继承中的内存布局
查看>>
学习日记2:nginx配置文件
查看>>
iOS Cell异步图片加载优化,缓存机制详解
查看>>
第二章 基本数据结构
查看>>
(转)Unity3D移动平台动态读取外部文件全解析
查看>>
回顾与陈景润讨论歌德巴哈猜想的情景
查看>>
java编写的2048程序
查看>>
解决git clone时报错:The requested URL returned error: 401 Unauthorized while accessing
查看>>
xamarin forms中的Button文本默认大写
查看>>
通过构造函数检查生成对象个数
查看>>
51Nod - 1057 -- N的阶乘(大整数乘法)
查看>>
算法入门经典-第四章 例题4-4 信息解码
查看>>
StarWind的安装配置
查看>>
计划安装SQL Server2012需求详细
查看>>
第一天:学会如何在pycharm上编写第一条robotframework用例
查看>>
python selenium firefox 添加cookie add_cookie
查看>>