JAVA多线程——ReadWriteLock
1. 新建资源类
/**
* @author huangdh
* @version 1.0
* @description:
* @date 2022-10-30 15:41
*/
// 资源类
public class MyCache {
/**
* 写锁:独占锁
* 读锁:共享锁
*/
// 创建map集合
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() + "正在写数据" + key);
TimeUnit.MILLISECONDS.sleep(300);
map.put(key,value);
System.out.println(Thread.currentThread().getName() + "写完了" + key);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
readWriteLock.writeLock().unlock();
}
}
// 读取数据
public Object get(String key){
Object object = null;
// 上锁
readWriteLock.readLock().lock();
try {
System.out.println(Thread.currentThread().getName() + "正在读取操作" + key);
TimeUnit.MILLISECONDS.sleep(300);
object = map.get(key);
System.out.println(Thread.currentThread().getName() + "数据读取完毕" + key);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
readWriteLock.readLock().unlock();
}
return object;
}
}
2. 操作资源类
/**
* @author huangdh
* @version 1.0
* @description:
* @date 2022-10-30 16:13
*/
public class ReadWriteLockDemo {
public static void main(String[] args) {
MyCache myCache = new MyCache();
for (int i = 0; i < 5; i++) {
final int num = i;
new Thread(()->{
myCache.put(String.valueOf(num),num);
},String.valueOf(i)).start();
}
for (int i = 0; i < 5; i++) {
final int num = i;
new Thread(()->{
myCache.get(String.valueOf(num));
},String.valueOf(i)).start();
}
}
}
3. 程序运行结果
0正在写数据0
0写完了0
1正在写数据1
1写完了1
2正在写数据2
2写完了2
3正在写数据3
3写完了3
4正在写数据4
4写完了4
0正在读取操作0
1正在读取操作1
2正在读取操作2
3正在读取操作3
4正在读取操作4
4数据读取完毕4
3数据读取完毕3
1数据读取完毕1
0数据读取完毕0
2数据读取完毕2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决