ReentrantLock

Condition

可以选择性的进行线程通知,在调度线程上更加灵活。

wait/notify方法进行通知时,被通知的线程是有JVM随机选择的,Condition的signalAll可以"选择性的通知"

公平锁与非公平锁

锁Lock分为“公平锁”和“非公平锁”;ReentrantLock默认为非公平锁

公平锁是线程获取锁的顺序是按照线程加锁的顺序来分配的,即先来先得的FIFO。

非公平是一种获取锁的枪占机制,是随机获取的,先来的不一定能先获取锁,这中方式可能某些线程一直拿不到锁,结果就不公平了。

private Lock lock = new ReentrantLock(false);

ReentrantReadWriteLock类:

类ReentrantLock具有去互斥排他的效果,即同一时间只有一个线程在执行ReentrantLock.lock()之后的方法,即获取锁的方法,保证实例变量的线程安全性,但是效率非常低下,而ReentrantReadWriteLock是读写锁,它可以加快运行效率。

读写锁表示有两个锁,一个是读操作相关的锁,也称为共享锁;另外一个是写操作相关的锁,也叫排他锁,多个读锁之间不互斥,与写操作相关的都是互斥锁, 多个Thread可以同时进行读取操作,但是同一个时间只允许一个Thread进入写入操作。  

代码 略。。。

代码结果同时获取读锁:

 代码获取写锁:

生产者/消费者模式 打印奇数偶数

//锁对象 ,必须是同一把锁
public
class Num { int i=1; boolean flag=false; Lock lock=new ReentrantLock(); Condition condition=lock.newCondition(); } public class EvenPrint implements Runnable { private Num num; public EvenPrint(Num num){ this.num=num; } @Override public void run() { while (num.i<=500){
//上锁 num.lock.lock();
if(num.i%2==0){ System.out.println(Thread.currentThread().getName()+ "偶数——————"+num.i); num.i++;
//唤醒 奇数线程 num.condition.signal(); }
else{ try {
          //等待 num.condition.await(); }
catch (InterruptedException e) { e.printStackTrace(); } } } } } public class OddPrint implements Runnable { private Num num; public OddPrint(Num num) { this.num = num; } @Override public void run() { while (num.i <= 500) { num.lock.lock(); if (num.i%2 !=0) { System.out.println(Thread.currentThread().getName() + "奇数——————" + num.i); num.i++; num.condition.signal(); } else { try { num.condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } public class Run { public static void main(String[] args) { Num num = new Num(); OddPrint oddPrint = new OddPrint(num); EvenPrint evenPrint = new EvenPrint(num); Thread thread1 = new Thread(oddPrint); Thread thread2 = new Thread(evenPrint); thread1.setName("奇数线程"); thread1.start(); thread2.setName("偶数线程"); thread2.start(); } }
原文地址:https://www.cnblogs.com/fanBlog/p/11383875.html