java – 显式锁是否自动提供内存可见性?
发布时间:2020-12-14 16:28:28 所属栏目:Java 来源:网络整理
导读:示例代码: class Sample{ private int v; public void setV(){ Lock a=new Lock(); a.lock(); try{ v=1; }finally{ a.unlock(); } } public int getV(){ return v; }} 如果我有一个线程不断调用getV,我只是在另一个线程中执行setV一次,那读取线程是否保证在
示例代码:
class Sample{ private int v; public void setV(){ Lock a=new Lock(); a.lock(); try{ v=1; }finally{ a.unlock(); } } public int getV(){ return v; } } 如果我有一个线程不断调用getV,我只是在另一个线程中执行setV一次,那读取线程是否保证在写入后立即看到新值?还是需要使“V”变化或AtomicReference? 如果答案是否定的,那么我应该把它改成: class Sample{ private int v; private Lock a=new Lock(); public void setV(){ a.lock(); try{ v=1; }finally{ a.unlock(); } } public int getV(){ a.lock(); try{ int r=v; }finally{ a.unlock(); } return r; } } 解决方法
从
documentation:
如果您在两个线程中使用Lock(即读取和写入),读取线程将看到新值,因为monitorEnter会刷新缓存.否则,您需要声明变量volatile以强制在读取线程中从内存读取. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- java – 45000 ms后无法在端口7055上连接到主机127.0.0.1.用
- 俄罗斯方块游戏完整Java源码
- java – 什么是Tomcat JDBC连接池的maven坐标?
- java – 重新登录log4j到slf4j
- SpringMVC结合Jcrop实现图片裁剪
- MouseListener帮助Java
- 如何强制超时为DriverManager.getConnection()方法调用?
- java – 嵌入式Jetty – Spring MVC – 视图解析器 – 无XM
- java – 在Windows桌面上创建快捷方式图标
- 如何根据Java中的URLConnection设置与BufferedReader的超时