【Java高并发学习】重入锁ReentrantLock、Condition条件及信号量
来源:互联网 发布:手机编程培训 编辑:程序博客网 时间:2024/04/30 20:49
Java重入锁、Condition、信息量
1.重入锁
import java.util.concurrent.locks.ReentrantLock;/** * 重入锁 * @author wsz * @date 2017年12月2日 */public class ReentertLock implements Runnable{public static ReentrantLock lock = new ReentrantLock();//重入锁public static long count =0L;public static void main(String[] args) throws InterruptedException {ReentertLock reentertLock = new ReentertLock();Thread t1 = new Thread(reentertLock);//接口构造函数Thread t2 = new Thread(reentertLock);t1.start();t2.start();t1.join();t2.join();System.out.println(count);}@Overridepublic void run() {for (int i = 0; i < 10000; i++) {lock.lock();//加锁count++;lock.unlock();//解锁,次数必须与加锁次数一致,否则将导致}}}
2.重入锁中断请求
import java.util.concurrent.locks.ReentrantLock;/** * 重入锁之中断锁请求 * 1.提供死锁环境 * 2.结束死锁 * 3.被中断线程无法完成任务 * @author wsz * @date 2017年12月2日 */public class IntLock implements Runnable{public static ReentrantLock lock1 = new ReentrantLock();//重入锁public static ReentrantLock lock2 = new ReentrantLock();//重入锁//控制加锁顺序,用于创造死锁private int lock;public IntLock(int lock) {super();this.lock = lock;}public static void main(String[] args) throws InterruptedException {IntLock intLock1 = new IntLock(1);IntLock intLock2 = new IntLock(2);Thread t1 = new Thread(intLock1);//t1先占有锁lock1,再请求lock2Thread t2 = new Thread(intLock2);//t2先占有lock2,再请求lock1t1.start();t2.start();//开启后形成死锁Thread.sleep(2000);t2.interrupt();//中断t2,t1将执行结束,t2放弃并结束}@Overridepublic void run() {try {if(lock == 1) { lock1.lockInterruptibly();//在等待锁时可以响应中断try {Thread.sleep(1000);}catch (InterruptedException e) {}lock2.lockInterruptibly();//在等待锁时可以响应中断}else {lock2.lockInterruptibly();//在等待锁时可以响应中断try {Thread.sleep(1000);}catch (InterruptedException e) {}lock1.lockInterruptibly();//在等待锁时可以响应中断}} catch (InterruptedException e) {e.printStackTrace();}finally {if(lock1.isHeldByCurrentThread()) {//Queries if this lock is held by the current thread. lock1.unlock();}if(lock2.isHeldByCurrentThread()) {//判断当前线程是否拥有该锁lock2.unlock();}System.out.println(Thread.currentThread().getId()+"线程退出");}}}
3.Condition条件
import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;/** * 重入锁与Condition * @author wsz * @date 2017年12月2日 */public class ConditionLock implements Runnable{public static ReentrantLock lock = new ReentrantLock();//重入锁public static Condition condition = lock.newCondition();//绑定相关的Condition实例@Overridepublic void run() {try {lock.lock();condition.await();//等待并释放锁System.out.println("aaa");}catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}public static void main(String[] args) throws InterruptedException {ConditionLock cl = new ConditionLock();Thread t1 = new Thread(cl);t1.start();Thread.sleep(2000);lock.lock();condition.signal();//唤醒等待在Condition上的线程lock.unlock();//解锁之后,将打印,否则无法执行。}}
4.信号量Semaphore
信号量提供多个线程来同时访问某一个资源。内部锁synchronized和重入锁ReentrantLock一次都只允许一个线程访问一个资源。
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Semaphore;/** * 信号量 * @author wsz * @date 2017年12月2日 */public class SemaphoreTest implements Runnable{//型号量准入数、是否公平锁;设置为3将以每3个线程一组打印信息final Semaphore semp = new Semaphore(3, false);public static void main(String[] args) {ExecutorService exec = Executors.newFixedThreadPool(20);//开启保护20个线程的线程池SemaphoreTest demo = new SemaphoreTest();for(int i=0 ;i <50 ;i++) {exec.submit(demo);}}@Overridepublic void run() {try {semp.acquire(); //尝试获得一个准入的许可,如无法获得将等待,直到获得一个许可或者当前线程被中断Thread.sleep(2000);//模拟耗时System.out.println(Thread.currentThread().getId()+":ok ok");semp.release();} catch (InterruptedException e) {e.printStackTrace();}}}
阅读全文
0 0
- 【Java高并发学习】重入锁ReentrantLock、Condition条件及信号量
- JDK并发包---(6)重入锁ReentrantLock搭档:Condition条件
- java并发包学习系列:重入锁与Condition条件
- java并发包:重入锁与Condition条件
- java并发控制:ReentrantLock Condition使用详解
- java并发API:Condition与ReentrantLock
- java并发包-ReentrantLock(四):Condition
- java并发控制:ReentrantLock Condition使用详解
- 【Java并发】- ReentrantLock,重入锁
- java 并发类semaphore countdownlatch cyclicbarrier reentrantlock condition reentrantreadwritelock
- Java并发编程 之 Condition与ReentrantLock的使用
- 【java并发】条件阻塞Condition的应用
- 并发编程学习总结(五) :java 显式锁ReentrantLock使用详解之条件对象(2)
- java高并发程序设计总结三:JDK并发包之ReentrantLock重入锁
- Java 并发及同步相关 Synchronized ReentrantLock
- java线程之Condition、ReentrantLock
- 【Java多线程】ReentrantLock与Condition
- 聊聊高并发(十四)理解Java中的管程,条件队列,Condition以及实现一个阻塞队列
- maven私服搭建和使用
- 关于Thread中的toString的问题
- C++实现二叉树的递归遍历与非递归遍历
- 友盟多渠道打包
- Fiddler的详细介绍
- 【Java高并发学习】重入锁ReentrantLock、Condition条件及信号量
- eclipse的maven的配置
- Linux 内存(free buffer cache)
- UML与软件开发
- 珂朵莉的数列
- Linux 初步学习
- Mybatis之工作原理
- 数据结构-单链表实现队列
- 浅谈数学、数学建模与人工智能(机器学习,深度学习)之间的关系?