| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> ReentrantWriteLock -> 正文阅读 |
|
[大数据]ReentrantWriteLock |
目录 ?使用ReentrantWriterReaderLock例子 ?
读读并发,读写,写写互斥; 可重入?:在写锁中可以放读锁,因为读锁是是并行的,提高效率 ?读写分离: 我们知道,对于一个数据,不管是几个线程同时读都不会出现任何问题,但是写就不一样了,几个线程对同一个数据进行更改就可能会出现数据不一致的问题,因此想出了一个方法就是对数据加锁,这时候出现了一个问题: 比如,你有多个线程在读取内容,另一个线程给他升级版本,这样对读取肯定不友好——>这就是读写锁的重入;(但是这套重入只针对于读的时候写) 如果是写的时候读那就没关系了(边更新边读取内容)——>也就是说我们可以在写锁释放前获得读锁;——>可以理解为降级
降级为读锁的好处:可以让其他线程都读取缓存数据,不被其他线程写烦扰,然后写锁unlock防止其他线程干扰数据,造成读影响;——>因为读锁是可以并行的,所以降锁可以实现一起读取内容的功能;
?首次没有数据的时候,可能发生多个线程查询数据但是没有缓存数据
提出问题:是先清缓存还是先更新数据库? 1.先清缓存时: 当B先清空缓存,进行更新,还没更新完A对数据库查询并缓存;当B更新完后,A读取的一直是原来的值而不是更新后的值,因为缓存在更新前就已经实现了; 2.先更新数据库再清缓存: 当B先对数据库进行更新时,缓存就算不一致也没关系,因为你其他线程进行数据库查询就会得到新值——>可以后面将缓存内容纠正过来; ?为了防止指令交错,出现指令重排现象:加锁
?进行双重检查——>对于数据:先在外面加写锁,如果缓存中没有value数据,就进行查询数据,然后再将数据放入缓存; 比如有多个线程,第一个线程拿到锁,进行判断发现缓存中没有数据,于是查询数据并放入缓存,释放锁后,其他线程进入发现有数据,直接返回即可;(map中的get数据相当于查询不需要保证原子性) ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 0:51:58- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |