readwritelock

ReadWriteLock和ReentrantLock相比,在读多写少的场景下,性能有很多的提升

1、读读不互斥
2、读写互斥
3、写写互斥

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
package concurrent;

import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;


* @description 类描述:
* @author 作者:LIYONG
* @create 创建时间:2017-4-16
* @update 修改时间:2017-4-16
*/

public class {

Lock lock = new ReentrantLock();
ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
Lock readLock = readWriteLock.readLock();
Lock writeLock = readWriteLock.writeLock();
int value = 0;

public int read(Lock lock) {

try {
lock.lock();
Thread.sleep(1 * 1000);
System.out.println("读到的值为 :" + value);
return value;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return value;
} finally {
lock.unlock();
}

}

public void write(Lock lock, int value) {

try {
lock.lock();
Thread.sleep(1 * 1000);
this.value = value;
System.out.println("写入的值为 :" + value);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}

}

public static void main(String[] args) {

final ReadWriteLockDemo demo = new ReadWriteLockDemo();

Runnable readRun = new Runnable() {

public void run() {

// Lock lock = demo.lock;
Lock lock = demo.readLock;
int value = demo.read(lock);

}

};
Runnable writeRun = new Runnable() {

public void run() {

// Lock lock = demo.lock;
Lock lock = demo.writeLock;
demo.write(lock, new Random().nextInt());

}

};
for (int i = 0; i < 20; i++) {
if (i > 1) {
new Thread(readRun, "" + i).start();
} else {
new Thread(writeRun, "" + i).start();

}
}

}

}