Java 读写锁 ReadWriteLock 实战
一 点睛
ReadWriteLock 中的读锁是共享锁,写锁是排他锁,共享锁允许不同线程同时读,排他锁只允许一个线程写,其他线程等待。
二 代码
import java.util.Random;
import java.util.concurrent.atomic.LongAdder;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class T10_TestReadWriteLock {
static Lock lock = new ReentrantLock();
private static int value;
static ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
// 读锁
static Lock readLock = readWriteLock.readLock();
// 写锁
static Lock writeLock = readWriteLock.writeLock();
// 模拟读取操作
public static void read(Lock lock) {
try {
lock.lock();
Thread.sleep(1000);
System.out.println("read over!");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 一定要解锁
lock.unlock();
}
}
// 模拟写操作
public static void write(Lock lock, int v) {
try {
lock.lock();
Thread.sleep(1000);
value = v;
System.out.println("write over!");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
//Runnable readR = ()-> read(lock);
// 读时,传读锁
Runnable readR = () -> read(readLock);
//Runnable writeR = ()->write(lock, new Random().nextInt());
// 写时,传写锁
Runnable writeR = () -> write(writeLock, new Random().nextInt());
for (int i = 0; i < 18; i++) new Thread(readR).start();
for (int i = 0; i < 2; i++) new Thread(writeR).start();
}
}
三 测试
1 使用 ReentrantLock 要用 20 秒。读用了 18 秒,写用了 2 秒。
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
write over!
write over!
2 使用 ReentrantReadWriteLock 只要 3 秒。读用了 1 秒,写用了 2 秒。
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
write over!
write over!
还没有评论,来说两句吧...