JUC:基于cas的新类型锁<br>(底层基于AQS的队列实现)
ReentrantLock<br>(替代synchronized)<br>
常用方法
new ReentrantLock(true)
设true为公平锁(默认为非公平锁):新线程会检查队列中有没<br>有内容,如果有(即有线程在等这把锁)则进队列等别人先运行<br>
unlock
释放锁,try中获取锁后必须在finally中释放锁
tryLock
尝试锁定,比如5秒钟获得锁,那就进行unlock前的操作,否则就不进行
lockInterruptibly
可以被打断的加锁(对interrupt方法做出响应),如<br>果只是用lock方法的话,那获取不到锁就会卡死在这<br>
interrupt
停止线程等待,停止lockInterruptibly的加锁等待
与synchronized区别
1、synchronized系统自动加锁解锁,ReentrantLock需要手动加解锁
2、R使用CAS实现,S通过锁升级
其他:tryLock、lockInterruptibly,以及可以进行公平与非公平的切换,可以指定唤醒某些线程
CountDownLatch<br>(和线程的join类似功能)
常用方法
new CountDownLatch(线程数)
用线程数设置门栓数
countDown
门栓数-1,在线程方法结束时使用该方法(也可以在一个线程中countDown多次)
CyclicBarrier<br>(满parties个线程就继续执行,否则阻塞)
常用方法
new CyclicBarrier(parties)
创建一个CyclicBarrier,解除标准是线程等待数=parties<br>
Phaser<br>(阶段控制)
概念
可以控制有n个线程全部完成某个阶段的任务时才能进入下一步
ReentrantReadWriteLock<br>(读写锁、大量读少量写)
概念
共享锁(读)、排他锁(写)
读线程加锁后,另一个读线程进来可以读,另一个写线程进来则阻塞
常用方法
ReadWriteLock readWriteLock = new ReentrantReadWriteLock()
设置读写锁
Lock readLock = readWriteLock.readLock ()
设置读锁,在读线程加读锁
Lock writeLock = readWriteLock.writeLock()
设置写锁,在写线程加写锁
使用场景
大量读线程、少量写线程时,读写锁可以大量提升效率,否则所有线程都要一个<br>一个锁住执行,效率很低,比如公司结构图(大量读该结构,很少修改该结构)<br>
Semaphore<br>(信号灯,限流)
概念
简单来说就是设置一个信号灯,灯亮着的时候就可以执行,不亮就不能执行
常用方法
new Semaphore(permits)
指定允许数量
new Semaphore(permits,fair)
fair指定是否为公平锁,默认为false非公平
acquire
得到一个信号量(得到信号量后需要在finally中释放)
使用场景
限流:最多有多少线程运行,比如最多只能开5个窗口卖票
Exchanger<br>(交换器)
概念
简单来说就是一个线程和另一个线程通过exchange方法交换数据
常用方法
Exchanger<String> exchanger = new Exchanger<>();
定义一个交换器并制定类型
exchange
将数据放到exchanger中并阻塞(可以指定timeout超时时间),当有另一个线程来放的时<br>候,把两个值交换,然后释放,有点CyclicBarrier的味道,满两个才交换,然后继续执行<br>
拓展
jdk1.9以后设置CLH后置节点有一个VarHandle的类
1、能做到普通属性的原子性操作
2、比反射快,直接操作二进制码修改变量