Lock锁
大约 2 分钟JavaJUC并发编程
Lock接口

Lock接口的实现类
All Known Implementing Classes:
// 可重入锁(常用)
ReentrantLock,
// 读锁
ReentrantReadWriteLock.ReadLock,
// 写锁
ReentrantReadWriteLock.WriteLock
ReentrantLock

公平锁:十分公平,可以先来后到。
非公平锁:十分不公平,可以插队。(默认)
1、new ReentrantLock()
2、加锁
3、解锁
public class SafeTicketDemo2 {
public static void main(String[] args) {
// 把资源类丢入线程
Ticket2 ticket = new Ticket2();
new Thread(() -> {
for (int i = 0; i < 40; i++) {
ticket.sale();
}
}, "A").start();
new Thread(() -> {
for (int i = 0; i < 40; i++) {
ticket.sale();
}
}, "B").start();
new Thread(() -> {
for (int i = 0; i < 40; i++) {
ticket.sale();
}
}, "C").start();
}
}
/**
* 资源类 OOP编程
*/
class Ticket2{
private int num = 30;
/** 1、new ReentrantLock() **/
Lock lock = new ReentrantLock();
/**
* synchronized本质:队列 + 锁
*/
public void sale(){
// 2、加锁
lock.lock();
try {
// 业务代码
if (num > 0){
System.out.println(Thread.currentThread().getName()+"卖出了第"+num--+"张票,剩余:"+num);
}
} catch (Exception e){
e.printStackTrace();
} finally {
// 3、解锁
lock.unlock();
}
}
}
结果:
A卖出了第30张票,剩余:29
A卖出了第29张票,剩余:28
A卖出了第28张票,剩余:27
A卖出了第27张票,剩余:26
A卖出了第26张票,剩余:25
A卖出了第25张票,剩余:24
A卖出了第24张票,剩余:23
A卖出了第23张票,剩余:22
C卖出了第22张票,剩余:21
C卖出了第21张票,剩余:20
C卖出了第20张票,剩余:19
C卖出了第19张票,剩余:18
C卖出了第18张票,剩余:17
C卖出了第17张票,剩余:16
C卖出了第16张票,剩余:15
C卖出了第15张票,剩余:14
C卖出了第14张票,剩余:13
C卖出了第13张票,剩余:12
C卖出了第12张票,剩余:11
C卖出了第11张票,剩余:10
C卖出了第10张票,剩余:9
C卖出了第9张票,剩余:8
C卖出了第8张票,剩余:7
C卖出了第7张票,剩余:6
C卖出了第6张票,剩余:5
C卖出了第5张票,剩余:4
C卖出了第4张票,剩余:3
C卖出了第3张票,剩余:2
C卖出了第2张票,剩余:1
C卖出了第1张票,剩余:0
Process finished with exit code 0