Lock锁_java

Lock

1
import java.util.concurrent.locks.Lock

Lock实现提供了比使用synchronized方法和语句可获得的更加广泛的锁定操作。

Lock接口中的方法:

  • void lock() 获取锁
  • void unlock() 释放锁
1
2
import java.util.concurrent.locks.ReentrantLock;
//ReentrantLock implements Lock

使用步骤

  1. 在成员位置创建一个ReentrantLock对象
  2. 在可能会出现安全问题的代码前调用Lock接口中的方法lock获取锁
  3. 在可能会出现安全问题的代码后调用Lock接口中的方法unLock释放锁

卖票案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class DemoRunnableImpl implements Runnable {
private static int ticket = 100;
private Lock l = new ReentrantLock();
@Override
public void run() {
while(true){
l.lock();
if(ticket>0){
try {
System.out.println("线程 "+ Thread.currentThread().getName() +" 出售第" + ticket + "张票");
Thread.sleep(1); // 增加耗时操作
ticket--;
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
l.unlock(); // 无论是否出现异常都把锁释放
}
}else{
l.unlock();
break;
}
}
}
}
1
2
3
4
5
6
7
8
9
10
public class Main {
public static void main(String[] args) {
DemoRunnableImpl stri = new DemoRunnableImpl();
new Thread(stri).start();
new Thread(stri).start();
new Thread(stri).start();
new Thread(stri).start();
new Thread(stri).start();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// 结果:
线程 Thread-0 出售第100张票
线程 Thread-0 出售第99张票
线程 Thread-0 出售第98张票
线程 Thread-0 出售第97张票
线程 Thread-0 出售第96张票
线程 Thread-0 出售第95张票
线程 Thread-0 出售第94张票
线程 Thread-0 出售第93张票
线程 Thread-0 出售第92张票
线程 Thread-0 出售第91张票
线程 Thread-0 出售第90张票
线程 Thread-0 出售第89张票
线程 Thread-0 出售第88张票
线程 Thread-0 出售第87张票
线程 Thread-0 出售第86张票
线程 Thread-0 出售第85张票
线程 Thread-0 出售第84张票
线程 Thread-0 出售第83张票
线程 Thread-0 出售第82张票
线程 Thread-0 出售第81张票
线程 Thread-0 出售第80张票
线程 Thread-0 出售第79张票
线程 Thread-0 出售第78张票
线程 Thread-0 出售第77张票
线程 Thread-0 出售第76张票
线程 Thread-0 出售第75张票
线程 Thread-0 出售第74张票
线程 Thread-0 出售第73张票
线程 Thread-0 出售第72张票
线程 Thread-0 出售第71张票
线程 Thread-0 出售第70张票
线程 Thread-0 出售第69张票
线程 Thread-0 出售第68张票
线程 Thread-0 出售第67张票
线程 Thread-0 出售第66张票
线程 Thread-0 出售第65张票
线程 Thread-0 出售第64张票
线程 Thread-0 出售第63张票
线程 Thread-0 出售第62张票
线程 Thread-0 出售第61张票
线程 Thread-0 出售第60张票
线程 Thread-0 出售第59张票
线程 Thread-0 出售第58张票
线程 Thread-0 出售第57张票
线程 Thread-0 出售第56张票
线程 Thread-0 出售第55张票
线程 Thread-0 出售第54张票
线程 Thread-0 出售第53张票
线程 Thread-0 出售第52张票
线程 Thread-0 出售第51张票
线程 Thread-0 出售第50张票
线程 Thread-0 出售第49张票
线程 Thread-0 出售第48张票
线程 Thread-0 出售第47张票
线程 Thread-0 出售第46张票
线程 Thread-0 出售第45张票
线程 Thread-0 出售第44张票
线程 Thread-0 出售第43张票
线程 Thread-0 出售第42张票
线程 Thread-0 出售第41张票
线程 Thread-0 出售第40张票
线程 Thread-0 出售第39张票
线程 Thread-0 出售第38张票
线程 Thread-0 出售第37张票
线程 Thread-0 出售第36张票
线程 Thread-0 出售第35张票
线程 Thread-1 出售第34张票
线程 Thread-1 出售第33张票
线程 Thread-1 出售第32张票
线程 Thread-1 出售第31张票
线程 Thread-1 出售第30张票
线程 Thread-1 出售第29张票
线程 Thread-1 出售第28张票
线程 Thread-1 出售第27张票
线程 Thread-1 出售第26张票
线程 Thread-1 出售第25张票
线程 Thread-1 出售第24张票
线程 Thread-1 出售第23张票
线程 Thread-1 出售第22张票
线程 Thread-1 出售第21张票
线程 Thread-1 出售第20张票
线程 Thread-1 出售第19张票
线程 Thread-1 出售第18张票
线程 Thread-3 出售第17张票
线程 Thread-3 出售第16张票
线程 Thread-3 出售第15张票
线程 Thread-3 出售第14张票
线程 Thread-3 出售第13张票
线程 Thread-3 出售第12张票
线程 Thread-3 出售第11张票
线程 Thread-3 出售第10张票
线程 Thread-3 出售第9张票
线程 Thread-3 出售第8张票
线程 Thread-3 出售第7张票
线程 Thread-3 出售第6张票
线程 Thread-3 出售第5张票
线程 Thread-3 出售第4张票
线程 Thread-3 出售第3张票
线程 Thread-3 出售第2张票
线程 Thread-3 出售第1张票

Lock锁方法摘要

方法摘要
void lock() 获取锁。
void lockInterruptibly() 如果当前线程未被中断,则获取锁。
Condition newCondition() 返回绑定到此 Lock 实例的新 Condition 实例。
boolean tryLock() 仅在调用时锁为空闲状态才获取该锁。
boolean tryLock(long time, TimeUnit unit) 如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁。
void unlock() 释放锁。

Lock锁_java
https://blog.wangxk.cc/2020/08/30/Lock锁-java/
作者
Mike
发布于
2020年8月30日
许可协议