Open FraserYu opened 4 years ago
加我QQ 1250281049,可以交换友情链接 我的站 www.byteblogs.com
@zsg1994 加我QQ 1250281049,可以交换友情链接 我的站 www.byteblogs.com
麻烦按照 https://dayarch.top/friends 中的要求提供一下信息,谢谢
想请教一下楼主 头部的自动打代码的是自己写的js吗,还是接口呢,想学一下
@2662419405 想请教一下楼主 头部的自动打代码的是自己写的js吗,还是接口呢,想学一下
我拷贝别的主题的代码库...
好的楼主,感谢
博客是开源的项目吗?想要喜欢这个风格
@nameyou 博客是开源的项目吗?想要喜欢这个风格
请问博主在博客中的图片是用什么工具画的
博主,你好,看了你的ReentrantReadWriteLock中关于锁降级的时候,有个疑问还请解答下。 在博客中你采用了Oracle官网文档的示例
rwl.writeLock().lock();
try {
if (!cacheValid) {
data = ...
cacheValid = true;
}
rwl.readLock().lock();
} finally {
rwl.writeLock().unlock();
}
首先我能理解,你说的为什么要使用锁降级的解释,但我不明白的是:如果线程A第一个获取了写锁,进入了if (!cacheValid)
修改了data和cacheValid,那么即使他后面释放了写锁,线程B获取了写锁,可是基于上述代码,线程B无法进入if (!cacheValid)
,也就无法修改data,那么最终在use中使用的data还是线程A修改的data呀,这个例子即使不使用锁降级也不会出现缓存覆盖的问题啊,我的理解是否错了,还请博主帮忙解释下。
@xiaokexiang 博主,你好,看了你的ReentrantReadWriteLock中关于锁降级的时候,有个疑问还请解答下。 在博客中你采用了Oracle官网文档的示例
rwl.writeLock().lock(); try { if (!cacheValid) { data = ... cacheValid = true; } rwl.readLock().lock(); } finally { rwl.writeLock().unlock(); }
首先我能理解,你说的为什么要使用锁降级的解释,但我不明白的是:如果线程A第一个获取了写锁,进入了
if (!cacheValid)
修改了data和cacheValid,那么即使他后面释放了写锁,线程B获取了写锁,可是基于上述代码,线程B无法进入if (!cacheValid)
,也就无法修改data,那么最终在use中使用的data还是线程A修改的data呀,这个例子即使不使用锁降级也不会出现缓存覆盖的问题啊,我的理解是否错了,还请博主帮忙解释下。
不好意思,回复的稍稍晚了一些,你的说明我理解,cacheValid 是被 volatile 修饰,只能保证可见性,不能保证原子性,例子是没有修改 cacheValid 为false的情况, 万一有就会出现我文中说明的那种情况,所以说最终结论是,如果用不到后续变量就不需要锁的降级 ,不知道这样解释你是否理解呢呢?
@lishaolian 请问博主在博客中的图片是用什么工具画的
draw.io 下的misc 选项可以调节参数,另外 PPT 是最大的神器
大佬威武,我来也
https://dayarch.top/comments/
技术有时很枯燥,需要用有趣的方式解读.