多线程之Concurrent
一、 Lock
Lock接口定义了锁的几个基本方法:
- lock()
- unlock()
- trylock()
- new Condition
1 | Lock lock; |
二、 AbstractQueuedSynchronizer
并发工具包的作者(Doug Lea)希望它成为实现同步需求的基础。抽象类AbstractQueuedSynchronizer是用来构建锁和其他同步框架的基础。
使用一个int成员变量的state来表示同步状态的获取;通过一个FIFO队列来完成对state通过状态获取线程的排队。
重写同步器锁获取和释放的方法
- 独占式
1 | protected boolean tryAcquire(int arg) { |
- 共享式
1 | protected int tryAcquireShared(int arg) { |
- 同步器通过state来控制同步。使用同步器已经实现好三个方法来达到对同步的控制。
1 | protected final int getState() {return state;} |
通过继承同步器来实现Lock接口的锁的获取和释放。
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/**
* @author liuwang
* @date 2018/6/6
*/
public class DemoLock implements Lock {
private static class Sync extends AbstractQueuedSynchronizer{
protected Sync() {
super();
}
protected boolean tryAcquire(int arg) {
//TODO
return super.tryAcquire(arg);
}
protected boolean tryRelease(int arg) {
//TODO
return super.tryRelease(arg);
}
protected int tryAcquireShared(int arg) {
//TODO
return super.tryAcquireShared(arg);
}
protected boolean tryReleaseShared(int arg) {
//TODO
return super.tryReleaseShared(arg);
}
protected boolean isHeldExclusively() {
//TODO
return super.isHeldExclusively();
}
}
private Sync sync =new Sync();
public void lock() {
sync.acquire(1);
}
public void lockInterruptibly() throws InterruptedException {
sync.acquireInterruptibly(1);
}
public boolean tryLock() {
return false;
}
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
return sync.tryAcquire(1);
}
public void unlock() {
sync.release(1);
}
public Condition newCondition() {
return null;
}
}
三、ReentrantLock
可重入锁
四、WriteReadLock
读写锁
五、LockSupport
提供了直接对线程进行阻塞和唤醒的功能
六、Condition
使关联的锁等待,唤醒。