Lock锁
1.Lock锁简介
在官方文档中对Lock锁有这样的解释:
从这段话中可以得出Lock锁拥有着比synchronized更高的灵活性来处理编程中的并发问题
但是由于这种灵活性,所以我们需要在编写代码中来手动释放锁
我们可以看到Lock锁有三个实现类:
- ReetrantLock 可重入锁
- ReadLock 读锁(后面的文章会写到)
- WriteLock 写锁(后面的文章会写到)
2.ReetrantLock可重入锁
进入源码可以看到:
默认是非公平锁
公平锁:很公平,按照线程先来后到的顺序执行
非公平锁:可以插队(根据CPU决定)
买票案例(代码测试):
/**
* 资源类
*/
class Ticket2{
private int number = 50;
//可重入锁
Lock lock = new ReentrantLock();
/**
* 卖票的方式
* synchronized本质,队列,锁
*/
public void sale(){
lock.lock();
try {
//业务代码写在这
if(number > 0){
System.out.println(Thread.currentThread().getName() + "卖出了" + (number --) + "票,剩余:" + number);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
3.synchronized和Lock区别
- Synchronized是内置的Java关键字,Lock是一个类
- Synchronized无法判断获取锁的状态,Lock可以判断是否获取了锁
- Synchronized会自动释放锁,Lock必须要手动释放,如果不释放,会造成死锁
- Synchronized线程1(获得锁,阻塞)、线程2(等待);Lock锁就不一定会一直等下去
- Synchronized可重用锁,不可以中断,非公平;Lock,可用用锁,可以判断锁,非公平(可以字节设置)
- Synchronized适合锁少量的代码同步问题,Lock适合锁大量的同步代码