读锁与写锁
记住这3条:“读锁-读锁可以共存,读锁-写锁不可共存,写锁-写锁不可共存”。
用多线程来展示读锁和写锁的使用
public class ReadWriteLockDemo {
private static volatile Map<Integer, Object> map = new ConcurrentHashMap<>();
private static ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
public void get(Integer key) {
Lock readLock = null;
try {
readLock = lock.readLock();
readLock.lock();
System.out.println(Thread.currentThread().getName() + "\t 开始读取key:" + key);
Object value = map.get(key);
System.out.println(Thread.currentThread().getName() + "\t 结束读取key:" + key + ", value:" + value);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (readLock != null) {
readLock.unlock();
}
}
}
private void put(Integer key, Object value) {
Lock writeLock = null;
try {
writeLock = lock.writeLock();
writeLock.lock();
System.out.println(Thread.currentThread().getName() + "\t 开始写入key:" + key + ", value:" + value);
map.put(key, value);
System.out.println(Thread.currentThread().getName() + "\t 结束写入key:" + key + ", value:" + value);
} catch (Exception e) {
e.printStackTrace();
} finally {
writeLock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
System.out.println("------写锁不可与写锁共存-----");
for (int i = 0; i < 5; i++) {
final int finalI = i;
new Thread(() -> {
ReadWriteLockDemo readWriteLockDemo = new ReadWriteLockDemo();
readWriteLockDemo.put(finalI, finalI);
}, "A").start();
}
TimeUnit.SECONDS.sleep(3);
System.out.println("-----读锁与读锁可以共存-----");
for (int i = 0; i < 5; i++) {
final int finalI = i;
new Thread(() -> {
ReadWriteLockDemo readWriteLockDemo = new ReadWriteLockDemo();
readWriteLockDemo.get(finalI);
}, "B").start();
}
}
}
控制台输出如下:
------写锁不可与写锁共存----- A 开始写入key:0, value:0 A 结束写入key:0, value:0 A 开始写入key:3, value:3 A 结束写入key:3, value:3 A 开始写入key:4, value:4 A 结束写入key:4, value:4 A 开始写入key:1, value:1 A 结束写入key:1, value:1 A 开始写入key:2, value:2 A 结束写入key:2, value:2 -----读锁与读锁可以共存----- B 开始读取key:0 B 结束读取key:0, value:0 B 开始读取key:2 B 结束读取key:2, value:2 B 开始读取key:1 B 结束读取key:1, value:1

浙公网安备 33010602011771号