Java高级-JUC-locks

ReadWriteLock

java.util.concurrent.locks
Interface ReadWriteLock

所有已知实现类:
ReentrantReadWriteLock


public interface ReadWriteLock

A ReadWriteLock维护一对关联的locks ,一个用于只读操作,一个用于写入。 read lock可以由多个阅读器线程同时进行,只要没有作者。 write 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
class WriteRead {
// 写
public void write() {
System.out.println(Thread.currentThread().getName() + "开始写");
System.out.println(Thread.currentThread().getName() + "结束写");
}
// 读
public void read() {
System.out.println(Thread.currentThread().getName() + "开始读");
System.out.println(Thread.currentThread().getName() + "结束读");
}
}

public class ReadWriteLockTest {

public static void main(String[] args) {
readWriteLock();
}

public static void readWriteLock() {

WriteRead writeRead = new WriteRead();

for (int i = 0; i < 10; i++) {
new Thread(() -> {
writeRead.lock();
},"线程" + i).start();
}
for (int i = 0; i < 10; i++) {
new Thread(() -> {
writeRead.lock();
},"线程" + i).start();
}
}
}

结果:

线程1开始写
线程2开始写 <–插队
线程2结束写 <–插队
线程1结束写
线程8开始写
线程9开始写
线程9结束写
线程8结束写
线程4结束写
线程7开始写
线程7结束写
线程6开始写

加锁的效果:

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
class WriteRead {
final ReadWriteLock rwl = new ReentrantReadWriteLock();
// 写
public void writelock() {
rwl.writeLock().lock();
try {
System.out.println(Thread.currentThread().getName() + "开始写");
System.out.println(Thread.currentThread().getName() + "结束写");
} catch (Exception e) {
e.printStackTrace();
}finally {
rwl.writeLock().unlock();
}
}
// 读
public void readlock() {
rwl.readLock().lock();
System.out.println(Thread.currentThread().getName() + "开始读");
System.out.println(Thread.currentThread().getName() + "结束读");
rwl.readLock().unlock();
}
}

public class ReadWriteLockTest {

public static void main(String[] args) {
readWriteLock();
}

public static void readWriteLock() {

WriteRead writeRead = new WriteRead();

for (int i = 0; i < 10; i++) {
new Thread(() -> {
writeRead.writelock();
},"线程" + i).start();
}
for (int i = 0; i < 10; i++) {
new Thread(() -> {
writeRead.readlock();
},"线程" + i).start();
}
}
}

结果:

线程3开始写
线程3结束写
线程7开始写
线程7结束写
线程0开始写
线程0结束写
线程1开始写
线程1结束写
线程2开始写
线程2结束写
线程4开始写
线程4结束写
线程6开始写
线程6结束写
线程5开始写
线程5结束写
线程8开始写
线程8结束写
线程9开始写
线程9结束写

ReadWriteLock这个接口很简单,只有一个实现类ReentrantReadWriteLock

java.util.concurrent.locks
Class ReentrantReadWriteLock

java.lang.Object
java.util.concurrent.locks.ReentrantReadWriteLock

All Implemented Interfaces:
Serializable , ReadWriteLock


public class ReentrantReadWriteLock
extends Object
implements ReadWriteLock, SerializableReadWriteLock

  • | Modifier and Type | Class and Description |
    | —————– | ———————————————————— |
    | static class | ReentrantReadWriteLock.ReadLock 该锁由方法 readLock()返回。 |
    | static class | ReentrantReadWriteLock.WriteLock 该锁由方法 writeLock()返回。 |

小唠嗑:

本章到这里就结束了,谢谢耐心看到这里的各位Boss,如果觉得有哪里说的不好的地方,还请高抬贵手多多原谅,不惜指教。

最后,谢谢!

---本文结束感谢您的阅读!---