1.juc:Lock 1.5
tryLock() :非阻塞式得获取锁
lockInterruptily() : 响应中断
tryLock(long time,TimeUnit) :支持超时
2.synchronized与ReentrantLock的区别
(1)synchronized是JVM层面,是关键字;Lock是Java语言层面实现的"管理"
(2)Lock具备一些synchronized不具备的特性,如支持公平锁,支持多个等待队列,还支持读写锁
读写锁:读者写者问题
读线程:读读异步,读写同步
写线程:写写同步
读写锁实现:ReentrantReadWriteLock(实现缓存HashMap + ReentrantReadWriteLock)
读锁:ReadLock,多个线程在同一时刻可以共同获得该读锁
写锁:WriteLock,独占锁,多个线程在同一时刻只有一个线程可以取得该锁
共享锁:多个线程可以同时取得该锁 读锁 ReadLock 共享锁 == 无锁?
当写线程开始工作,所有其他线程(包含读线程)全部进入阻塞态.
JDK1.8 StampedLock 更加乐观的锁实现,性能比ReentrantReadWriteLock还高
juc包下工具类:CAS+Lock
1.闭锁CountDownLatch
public CountDownLatch(int count); //count 表示需要等待的线程个数
public void countDown(); //计数器值-1(类似运动员线程)
public void await() throws InterruptedException //等待线程调用该方法进入阻塞态,直到计数器减为0
CountDownLatch对象在计数器值减为0时不可恢复。只会阻塞调用await方法的线程
2.循环栅栏CyclicBarrier
public CyclicBarrier(int parties); //parties表示需要有多少个线程同时暂停以及恢复执行
public int await();//cyclicBarrier 计数器-1,当减为0时,所有阻塞线程同时恢复执行
public CyclicBarrier(int parties,Runnable barrierAction)//多个线程在恢复执行之前,任意挑选一个线程执行barrierAction任务后,再同时恢复执行
CyclicBarrier计时器值可以恢复,CyclicBarrier的对象可以重复使用。
3.Exchanger交换器
Exchanger用于两个线程交换数据,当缓冲区只有一个线程时,该线程会阻塞直到配对成功再交换数据恢复执行
4.Semaphore信号量
public Semaphore(int permits)//表示许可的数量
public Semaphore(int permits,boolean fair) : //等待时间最长的线程最先获取到许可