ReentrantLock实现机制
- 公平锁和非公平锁
1.公平锁的实现就是谁等待的时间长谁就先获取锁
2.非公平锁就是随机获取锁,谁运气好,cpu时间片轮询到哪个线程,哪个线程就能获取资源
3.公平锁在市里化对象时要写入参数"true"
4.非公平锁在实例化对象时不用写入参数,因为默认为非公平锁 - 可重入锁和不可重入锁
所谓不可重入锁就是当前线程执行某个方法已知获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞,可重入锁恰好与之相反,不会被阻塞。
Reentrant Lock时可重入锁
Synchornized也是可重入锁 - 线程同步
1.Synchornized
体现了多线程的有序性和可见性,加锁和解锁时是隐式的,修饰方法/代码块
2.Java内置关于CAS的类——Atomicxxx类
体现了多线程的原子性
3.Reentrant Lock
提供了无条件的、可轮询的、定时的以及可中断的锁获取操作,加锁和解锁都是显式的
Reentrant Lock实现了Lock接口 - Lock中的基础方法
void lock();
获取一个锁进行加锁操作
2.
void lockInterruptibly() throws InterryptedException;
Interruptibly意思是可中断的,该方法获取锁就是可中断
eg:
thread A acquired lock //线程A获取到锁
thread B wait //线程B获取不到,就在等待获取,处于阻塞状态
thread B interrupt() //响应中断—即B中断,处于等待获取锁的状态,直接抛出Interrupted Exception异常
3.
boolean trylock();
体现了可轮询性
该方法获取锁:只有在该锁被调用期间处于空闲状态,才能获取到
如果获取到该锁是可用的,则立刻返回一个值,即true
如果获取到锁是不可用的,则立刻赶回一个值,即false
如果为获取的化,也不会阻塞,抗译先进行别的事情,可以有一个while条件,不停地(可轮询的)去判断该把锁,获取到,则进行该锁索进行的事情;未获取到,进行其他事情,再判断
4.
boolean trylock(long time,TimeUnit unit)throws InterruptedException
未获取到,会等待一段时间,即阻塞一会而儿,但超时之后,还未获取,就先执行其他的,若阻塞(等待)期间获取到,则直接返回false
其他情况与上一个方法相同
5.
void unlock();
用来释放锁
6.
Condition newCondition();
condition意思为条件,该方法返回一个condition对象
设置获取锁的一个条件,满足该条件才能获取锁(Synchronized没有)
- Reentrant Lock的使用格式
Lock lock = new ReentrantLock();//实例化一个对象
try{
lock.lock();//加锁操作
}
finally{
lock.unlock();//释放锁
}
注意:lock中没有异常处理,所以不需要catch块
如果忘了释放锁,可能导致内存溢出或者造成死锁
- 响应中断(常用在死锁里面)
eg:
A:r1—>r2
B:r2—>r1
造成交叉锁(死锁常见问题的体一种),就会陷入死锁,但A.interrupt();会中断A,释放r1.则B获取到r1,就不会造成死锁 - 可定时(超时时间)
tryLock(long time,TimeUnit uint);
使用Reentrant Lock实现线程安全的单例,返回唯一一个实例