赞
踩
获得条件 | 排他性 | 作用 | |
读锁 | 写锁未被任意线程持有 | 对读线程是共享的,对写线程是排他的 | 允许多个读线程可以同时读取共享数据,保证在读共享数据时,没有其他线程对共享数据进行修改 |
写锁 | 该写锁未被其他线程持有,并且相应的读锁也未被其他线程持有 | 对读线程或者写线程都是排他的 | 保证写线程以独占的方式修改共享数据 |
2、ReadWriteLock 使用
==================
模拟缓存数据的写入和读取
不加读写锁的情况
package com.cheng.rw;
import java.util.HashMap;
import java.util.Map;
public class ReadWriteLock {
public static void main(String[] args) {
MyCache myCache = new MyCache();
//写操作
for (int i = 0; i < 5; i++) {
final int temp = i;
new Thread(()->{
myCache.set(temp+“”,temp+“”);
},String.valueOf(i)).start();
}
//读操作
for (int i = 0; i < 5; i++) {
final int temp = i;
new Thread(()->{
myCache.get(temp+“”);
},String.valueOf(i)).start();
}
}
}
class MyCache{
private volatile Map<String,Object> map = new HashMap<>();
//写操作
public void set(String key,Object value){
System.out.println(Thread.currentThread().getName()+“写入了”+key);
map.put(key,value);
System.out.println(Thread.currentThread().getName()+“写入操作完成”);
}
//读操作
public void get(String key){
System.out.println(Thread.currentThread().getName()+“读取了”+key);
Object o = map.get(key);
System.out.println(Thread.currentThread().getName()+“读取操作完成”);
}
}
运行查看结果:
不加读写锁,当前线程在进行写入操作时被其他线程插队。
加上读写锁
package com.cheng.rw;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteLock {
public static void main(String[] args) {
MyCacheLock myCache = new MyCacheLock();
//写操作
for (int i = 0; i < 5; i++) {
final int temp = i;
new Thread(()->{
myCache.set(temp+“”,temp+“”);
},String.valueOf(i)).start();
}
//读操作
for (int i = 0; i < 5; i++) {
final int temp = i;
new Thread(()->{
myCache.get(temp+“”);
},String.valueOf(i)).start();
}
}
}
class MyCacheLock{
private volatile Map<String,Object> map = new HashMap<>();
关于这份笔记,为了不影响大家的阅读体验,我只能在文章中展示部分的章节内容和核心截图
afka的生产者
QJYz-1714697766896)]
[外链图片转存中…(img-n5ooxyi0-1714697766897)]
[外链图片转存中…(img-aY2xCHme-1714697766897)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。