ReadWriteLock
2021/5/4 10:27:33
本文主要是介绍ReadWriteLock,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
ReadWriteLock
-
/** * 独占锁(写锁) * 一次只能被一个线程占有 * 共享锁(读锁) 多个线程可以同时占有 * * ReadWriteLock * 读-读 可以共存! * 读-写 不能共存! * 写-写 不能共存! */ public class Test04 { public static void main(String[] args) throws InterruptedException { MyCacheLock myCache = new MyCacheLock(); //写入 for (int i = 0; i < 5; i++) { final int count = i; new Thread(() -> { myCache.put(count + " ", count + " "); }, String.valueOf(i)).start(); } //写入 for (int i = 0; i < 5; i++) { final int count = i; new Thread(() -> { myCache.get(count + " "); }, String.valueOf(i)).start(); } } } //加锁的自定义缓存 class MyCacheLock { 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); 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() + "读取" + key); Object obj = map.get(key); System.out.println(Thread.currentThread().getName() + "读取完成"); } catch (Exception e) { e.printStackTrace(); } finally { readWriteLock.readLock().unlock(); } } } //自定义缓存 : 会出现插队写入 /* 会出现插队写入 : 0写入0 4写入4 4写入完成 3写入3 3写入完成*/ class MyCache { private volatile Map<String, Object> map = new HashMap<>(); //存,写 public void put(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 obj = map.get(key); System.out.println(Thread.currentThread().getName() + "读取完成"); } }
这篇关于ReadWriteLock的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-25Elevate Your Lead Generation Game with Maps Scraper AI
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能