- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
ReentrantReadWriteLock 的文档中有一个关于锁降级的示例用法(参见 this )。
class CachedData {
final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
Object data;
volatile boolean cacheValid;
void processCachedData() {
rwl.readLock().lock();
if (!cacheValid) {
// Must release read lock before acquiring write lock
rwl.readLock().unlock();
rwl.writeLock().lock();
try {
// Recheck state because another thread might have
// acquired write lock and changed state before we did.
if (!cacheValid) {
data = ...
cacheValid = true;
}
// Downgrade by acquiring read lock before releasing write lock
rwl.readLock().lock();//B
} finally {//A
rwl.writeLock().unlock(); // Unlock write, still hold read
}
}
try {
use(data);
} finally {//C
rwl.readLock().unlock();
}
}
}
如果我将对象数据
更改为 volatile 对象数据
,我是否还需要将写锁降级为读锁?
更新
我的意思是,如果我将 volatile
添加到data
,在我释放注释A处的
,我是否还需要像注释finally
block 中的写锁之前B
和C
处的代码那样获取读锁?或者代码可以利用 volatile
的优势?
最佳答案
不,无论您是否降级,都不需要 volatile
(锁定已经保证了对数据
的线程安全访问)。它也对原子性没有帮助,而原子性正是获取-读取-然后写入-锁定模式的作用(这也是问题的重点)。
您正在谈论需要降级,就像这是一件坏事一样。您可以保留写锁而不降级,一切都会正常进行。当读锁就足够时,您只是保持不必要的强锁。
您不需要降级为读锁,但如果不降级,您的代码效率会降低:如果 use(data)
需要 2 秒(很长一段时间) ,那么如果不进行锁定降级,每次刷新缓存时,您都会阻止所有其他读取器 2 秒。
如果您的意思是为什么在缓存刷新完成后甚至需要读锁,那是因为否则另一个线程可能会在我们“时启动新的缓存刷新(因为不会有任何锁)”我仍在处理use(data)
。
在给定的示例代码中,由于没有足够的信息,无法确定它是否真的重要,但它会为该方法创建一个可能的附加状态,这不是一个优势:
use(data)
状态,具有读锁use(data)
状态,一个线程正在使用写锁刷新缓存关于java - 使用ReentrantReadWriteLock时是否需要降级锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48358411/
是否可以将 Azure 云服务实例从“小型”虚拟机降级为“超小型”虚拟机? 到目前为止我尝试过的:- 将 Visual Studio 中的 VM 更改为“超小”- 构建了一个新包- 上传到门户网站-
几天前我更新了 Jenkins 。但是在当前的 Jenkins 版本中,存在一些烦人的 bug。是否可以降级 Jenkins 的版本,如果可以,怎么可能? 最佳答案 最近我也一直在努力降级 Jenki
我已经安装了 Android SDK 4.0.3,我想安装一个先行版本(例如 2.2),所以我应该卸载 4.0.3 版本吗? 怎么做? 最佳答案 只需在 Android SDK 管理器中安装所需的 S
最近我更新了我的 android 游戏,编辑 sqlite 数据库在我的表中添加新字段,更新后,我收到 4 个崩溃报告(其中 3 个来自同一设备,Samsung Galaxy S4) android.
思考:当活动服务出现性能问题以后,我们只能眼睁睁看着活动服务被压垮吗? 1、添加@HystrixCommand后,Hystrix是如何实现超时和降级功能? 1、 在某个方法上添加了@Hystrix
将 Magento 商店从企业版 1.10.1.1 降级到社区版 1.7.0.0 应遵循什么程序? 我做的步骤是: 备份 Magento EE 1.10.1.1 数据库 :) 将此数据库导入到一个名为
一个问题,因为我可以卸载并安装旧版本的 map 服务器,因为我导致大致以下错误,我认为是相同的版本 警告:[MapServer 错误]:msLoadSymbolSet():第一个标记必须是 SYMBO
如何降级我的 flutter 版本以避免空安全?我更新了,这个功能出现了,但我使用了一些包,比如徽章和 https,这些包没有更新为空安全,我得到了几个错误来运行我的代码。 我的pubspec: 环境
我已经为 Mysql 和 DBI 安装了 Perl 模块,但是由于我在当前版本中遇到的错误,我想将它们降级到旧版本。是否可以使用 cpan 将它们降级为旧版本?我该怎么做? 最佳答案 要强制安装特定版
我有一些关于 azure sql 升级/降级的问题。我发现的唯一信息是,要升级/降级,您必须导出 .bacpac 并将其导入到新的升级/降级服务器上。 当更新版本的 azure sql 可用时,Mic
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
我是 Android 开发的新手,我想我可能犯了一个错误。我一直在我的 build.gradle 文件中使用 compileSdkVersion 25。但我希望我的应用程序支持 Android 4.1
我使用它,它在 webkit 浏览器上运行良好,在 firefox 上运行简单。但是 Opera 给出了奇怪的结果。 我正在使用的 CSS: color:@coreDarkBlue; backgrou
我需要打开一个文件,对其进行读取锁定,然后尝试获取写入锁定,但如果失败则保留读取锁定。 这在使用 fcntl 锁定的 POSIX 中效果很好。 在 Windows 中,我可以使用 LockFileEx
我已经安装了 Xamarin(Xamarin studio、Xamarin.Android)但是即使是最简单的项目构建也存在一些问题(只需创建新项目->构建->出现错误)。 经过一些谷歌搜索后,我发现
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
我在尝试使用 Pyinstaller 时遇到错误。在做了一些研究之后,我认为该错误是由最新版本的 setuptools (19.3) 中的错误引起的。该修复程序似乎正在降级到 setuptools 版
我正在尝试使用 Angular 升级机制将我们的 ng1 项目升级到 ng2。实际上,我重写了一个组件,它提供了多个内容( Angular 为 1.5 的多重包含/插槽)。 我的问题是,它可以在一个组
我在 Ubuntu 服务器上本地托管 Gitlab。 在没有检查 Ubuntu 18.04 版本是否支持 Gitlab 的情况下,我刚刚安装了它。 现在我注意到我无法将我的 Gitlab 安装更新到最
假设 iOS 自动续订订阅提供对包含存储分配的服务的访问。有多个订阅级别,其允许的存储量各不相同。订阅者可能希望随着存储需求的变化而升级或降级其订阅。 StoreKit 文档向我展示了如何开始订阅,但
我是一名优秀的程序员,十分优秀!