java – 显式锁是否自动提供内存可见性?
发布时间:2020-08-04 22:30:13 所属栏目:Java 来源:互联网
导读:示例代码: class Sample{ private int v; public void setV(){ Lock a=new Lock(); a.lock(); try{ v=1; }finally{ a.unlock(); } }
示例代码: 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以强制在读取线程中从内存读取. (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- javaweb 实现文件下载的方法及实例代码
- java – 如何告诉Eclipse为所有项目添加标准的.jar库
- java字节码框架ASM的深入学习
- java – 我应该使用什么类型的数据结构来保存表行?
- 多线程 – 在Delphi 2006控制台应用程序中,TThread的工作方
- java – 我如何子类化ByteBuffer?
- java – 如何使用GSON / JSON将字符串数组转换为对象?
- java – 如何将JSONObject转换为gson.JsonObject?
- Spring 报错:元素 context:component-scan 的前缀 context
- java-开源Jalopy Eclipse插件与Ganymede兼容吗?