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兼容吗?
 
