package com.han.demo01;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* 独占锁(写锁):一次只能被一个线程占有
* 共享锁(读锁):多个线程可以同时占有
* ReadWriteLock
* 读-读 可以共存!
* 读-写 不能共存!
* 写-写 不能共存!
*/
public class TestReadWriteLock {
public static void main(String[] args) {
Cache cache = new Cache();
for (int i = 1; i <= 5; i++) {
String temp = String.valueOf(i);
new Thread(() -> {
cache.put(temp, temp);
}, String.valueOf(i)).start();
}
for (int i = 1; i <= 5; i++) {
String temp = String.valueOf(i);
new Thread(() -> {
cache.get(temp);
}, String.valueOf(i)).start();
}
}
}
class Cache {
private volatile Map<String, Object> map = new HashMap<>();
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
/**
* 加写锁保证一次只能有一个线程在写
*/
public void put(String key, Object value) {
readWriteLock.writeLock().lock();
try {
System.out.println(Thread.currentThread().getName() + "进行写入");
map.put(key, value);
System.out.println(Thread.currentThread().getName() + "写入完成");
} catch (Exception e) {
e.printStackTrace();
} finally {
readWriteLock.writeLock().unlock();
}
}
/**
* 加读锁保证读的时候不让写,但是可以多个线程同时读
*/
public void get(String key) {
readWriteLock.readLock().lock();
try {
System.out.println(Thread.currentThread().getName() + "进行读取");
map.get(key);
System.out.println(Thread.currentThread().getName() + "读取完成");
} catch (Exception e) {
e.printStackTrace();
} finally {
readWriteLock.readLock().unlock();
}
}
}
读写锁(共享锁、独占锁)
于 2022-05-10 22:28:59 首次发布