读写锁维护了一对相关的锁,一个用于只读操作,一个用于写入操作。只要没有writer,读取锁可以由多个reader线程同时保持。写入锁是独占的。
可重入读写锁 ReentrantReadWriteLock
ReentrantReadWriteLock对象提供了readLock()和writeLock()方法, 用于获取读取锁和写入锁.
- 读取锁允许多个reader线程同时持有, 而写入锁最多只能有一个writter线程持有.
- 读写锁的使用场合: 读取共享数据的频率远大于修改共享数据的频率. 在上述场合下, 使用读写锁控制共享资源的访问, 可以提高并发性能.
- 如果一个线程已经持有了写入锁, 则可以再持有读写锁. 相反, 如果一个线程已经持有了读取锁, 则在释放该读取锁之前, 不能再持有写入锁.
- 可以调用写入锁的newCondition()方法获取与该写入锁绑定的Condition对象, 此时与普通的互斥锁并没有什么区别. 但是调用读取锁的newCondition()方法将抛出异常.
例子
- 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
- 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
Thread-0, Read!
Thread-0 读取的数据为:0
Thread-1, Write
Thread-1写入的数据为: 6
Thread-5, Write
Thread-5写入的数据为: 5
Thread-2, Read!
Thread-6, Read!
Thread-4, Read!
Thread-6 读取的数据为:5
Thread-4 读取的数据为:5
Thread-2 读取的数据为:5
Thread-3, Write
Thread-3写入的数据为: 6
Thread-7, Write
Thread-7写入的数据为: 4
Thread-8, Read!
Thread-8 读取的数据为:4
Thread-9, Write
Thread-9写入的数据为: 0
Thread-10, Read!
Thread-10 读取的数据为:0
Thread-11, Write
Thread-11写入的数据为: 3
Thread-12, Read!
Thread-12 读取的数据为:3
Thread-13, Write
Thread-13写入的数据为: 0
Thread-14, Read!
Thread-14 读取的数据为:0
Thread-15, Write
Thread-15写入的数据为: 5
Thread-16, Read!
Thread-16 读取的数据为:5
Thread-17, Write
Thread-17写入的数据为: 0
Thread-18, Read!
Thread-18 读取的数据为:0
Thread-19, Write
Thread-19写入的数据为: 4
从图中我们可以看出,可以多个线程同时读,但只能一个线程写,即写数据和写入数据一并完成。
转载出处: http://blog.csdn.net/itmyhome1990/article/details/75391850