写入的时候获取锁独占,读取的时候可以共享。读写分离。保证数据一致性,提升数据并发性。
ReadWriteLockDemo.java
// 资源类
class Mycache {
// 可见,不保证原子性,禁止指令重排
private volatile Map<String, Object> map = new HashMap<>();
//读写锁
private ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
public void put(String key, Object value) {
// 写锁
readWriteLock.writeLock().lock();
System.out.println(Thread.currentThread().getName() + " 正在写入: " + key);
try {
// 暂停一会线程
TimeUnit.MICROSECONDS.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
map.put(key, value);
System.out.println(Thread.currentThread().getName() + " 写入完成: ");
// 解锁
readWriteLock.writeLock().unlock();
}
public void get(String key) {
// 读锁
readWriteLock.readLock().lock();
System.out.println(Thread.currentThread().getName() + " 正在读取: ");
try {
// 暂停一会线程
TimeUnit.MICROSECONDS.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
Object result = map.get(key);
System.out.println(Thread.currentThread().getName() + " 读取完成: " + result);
// 解锁
readWriteLock.readLock().unlock();
}
}
public class ReadWriteLockDemo {
public static void main(String[] args) {
Mycache mycache = new Mycache();
// 写
for (int i = 0; i < 5; i++) {
final int tempInt = i;
new Thread(() -> {
mycache.put(tempInt + "", tempInt + "");
}, String.valueOf(i)).start();
}
// 读
for (int i = 0; i < 5; i++) {
final int tempInt = i;
new Thread(() -> {
mycache.get(tempInt + "");
}, String.valueOf(i)).start();
}
}
}
备注:来自周老师。