Java—多线程7 Lock1
首先synchronize(this){}是自动加解锁
JDK1.5后新增了一个guc开发包 java.util.concurrent.locks,体统了与内建锁不同的实现多线程线程共享访问机制。失去了内建锁隐式的加锁与解锁过程。增加了可中断的获取锁,以及超时获取锁以及共享锁等内建锁不具备的特性。
##lock锁的标准使用形式
1.显示的上锁和解锁过程
Lock lock=new Lock();
try{
lock.lock();
//同步快
}finally{
lock.unlock();
}
lock接口API
lock接口API | 解释 |
---|---|
void lock() | 获取锁 |
void lockInterruptibly()thrwos InterruptedException | 获取锁的过程可以响应中断 |
boolean tryLock() | 获取锁返回true,反之返回false可以响应中断 |
boolean tryLock(long time,TimeUnit unit) | 在3的基础上增加超时等待机制,规定时间内未获取到锁,线程直接返回(Lock独有) |
void unLock | 解锁 |
在Lock接口实现了几种方法:
ReadWriterLock
ReentrantLock
ReentrantReadWriterLock
AbstractQueuedSynchronizer(AQS)同步器
1、同步器是用来构建锁与其他同步组件的基础框架。他的实现主要依赖一个int成员变量表示同步状态以及通过一个FIFO队列构成同步队列。
要使用AQS,推荐使用静态内部类继承AQS,覆写AQS中的protected用来改变同步状态的方法,其他方法主要是实现排队与阻塞机制。状态更新使用getState() setState() compareAndSetState()。
自定义锁
class MyLock implements Lock{
private Sync sync=new Sync();
static class Sync extends AbstractQueuedSynchronizer{
//默认的同步状态为1
@Override
protected boolean tryAcquire(int arg) {
if(arg!=1){
throw