今天看了多线程使用Lock和Condition
package com.cmb.firmbank.baseFrame.socket; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class X { private final ReentrantLock lock = new ReentrantLock(); Condition condition = lock.newCondition(); public void m(int i) { System.out.println("m start!"); lock.lock(); // block until condition holds try { System.out.println("try catch!"); } finally { lock.unlock(); } System.out.println("m end!"); } public static void main(String[] args) { X x = new X(); T1 t1 = new T1(x); T2 t2 = new T2(x); t1.start(); t2.start(); } } class T1 extends Thread{ private X x ; public T1(X x) { this.x = x; } @Override public void run() { x.m(0); } } class T2 extends Thread{ private X x ; public T2(X x) { this.x = x; } @Override public void run() { x.m(1); } }
一个线程进入lock里面,另外一个现场就无法进入lock,直到lock的线程unlock之后,第二个线程才能进入。
使用condition
package com.cmb.firmbank.baseFrame.socket; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class X { private final ReentrantLock lock = new ReentrantLock(); Condition condition = lock.newCondition(); public void m(int i) { System.out.println("m start!"); lock.lock(); // block until condition holds try { // ... method body if(i==0){ try { condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } else if(i==1){ condition.signal(); } System.out.println("try catch!"); } finally { lock.unlock(); } System.out.println("m end!"); } public static void main(String[] args) { X x = new X(); T1 t1 = new T1(x); T2 t2 = new T2(x); t1.start(); t2.start(); } } class T1 extends Thread{ private X x ; public T1(X x) { this.x = x; } @Override public void run() { x.m(0); } } class T2 extends Thread{ private X x ; public T2(X x) { this.x = x; } @Override public void run() { x.m(1); } }
当一个线程进入lock里面,未到condition.await()时,第二个线程无法进入lock里面,但是当第一个线程进入await等待时,第二个线程可以进入lock,直到第二个线程进入unlock后,第一个线程才从await往下走。
总结:
1、如果不使用condition,多个线程中只有一个能进入lock逻辑里面。
2、如果在lock中使用await,当前线程会等待,其他等待线程进入lock,当前线程直到其他线程的siginal之后,才继续往下走。
留此文便查
相关推荐
1、ReentrantLock简介 2、ReentrantLock函数列表 3、重入的实现 4、公平锁与非公平锁 5、ReentrantLock 扩展的功能 6
java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能。而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。这篇文章主要是从使用的角度来分析...
主要介绍了Java多线程中ReentrantLock与Condition详解,需要的朋友可以参考下
在JAVA中ReentrantLock 和synchronized 都是可重入锁; 重入锁ReentrantLock 相对来说是synchronized、Object.wait()和Object.notify()方法的替代品(或者说是增强版),在JDK5.0的早期版本,重入锁的性能远远好于...
Java多线程ReentrantLock1
用CyclicBarrier,reentrantlock,condition来完成同时购买,同步购买的功能 JUC系列之模拟抢票(N人同时抢票,票不足系统补仓,N-M人继续抢票) http://blog.csdn.net/crazyzxljing0621/article/details/77891620
Java多线程并发的程序中使用互斥锁有synchronized和ReentrantLock两种方式,这里我们来详解Java多线程编程中互斥锁ReentrantLock类的用法:
ReentrantLock.java
主要介绍了java ReentrantLock,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
ReentrantLock的基本用法 2.1 创建ReentrantLock 2.2 获取锁和释放锁 公平性与非公平性 3.1 公平锁 3.2 非公平锁 中断响应 条件变量与Condition 5.1 创建Condition 5.2 await()和signal() 可重入性 ReentrantLock与...
带你看看Javad的锁-ReentrantLock前言ReentrantLock简介Synchronized对比用法源码分析代码结构方法分析SyncNonfairSyncFairSync非公平锁VS公平锁什么是公平非公平ReentrantLockReentrantLock的构造函数lock加锁方法...
JavaLock与Condition的理解ReentrantLock锁的简单使用技巧共5页.pdf.zip
ReentrantLock类可以唤醒指定条件的线程,而object的唤醒是随机的 Condition类和Object类 Condition类的awiat方法和Object类的wait方法等效 Condition类的signal方法和Object类的notify方法等效 Condition类...
java语言 并发编程 ReentrantLock与synchronized区别 详解
深入java并发编程,使用ReentrantLock和 Synchronized加锁
主要介绍了Java多线程 ReentrantLock互斥锁详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要为大家详细介绍了Java并发系列之ReentrantLock源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
ReentrantLock的使用及注意事项