博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java并发编程(十四)同步问题的内存可见性
阅读量:5149 次
发布时间:2019-06-13

本文共 1301 字,大约阅读时间需要 4 分钟。

      

转载请注明出处:

          加锁(synchronized同步)的功能不仅仅局限于互斥行为,同时还存在另外一个重要的方面:内存可见性。我们不仅希望防止某个线程正在使用对象状态而另一个线程在同时修改该状态,而且还希望确保当一个线程修改了对象状态后,其他线程能够看到该变化。而线程的同步恰恰也能够实现这一点。

  置锁可以用于确保某个线程以一种可预测的方式来查看另一个线程的执行结果。为了确保所有的线程都能看到共享变量的最新值,可以在所有执行读操作或写操作的线程上加上同一把锁。下图示例了同步的可见性保证。

 

     当线程A执行某个同步代码块时,线程B随后进入由同一个锁保护的同步代码块,这种情况下可以保证,当锁被释放前,A看到的所有变量值(锁释放前,A看到的变量包括y和x)在B获得同一个锁后同样可以由B看到。换句话说,当线程B执行由锁保护的同步代码块时,可以看到线程A之前在同一个锁保护的同步代码块中的所有操作结果。如果在线程A unlock M之后,线程B才进入lock M,那么线程B都可以看到线程A unlock M之前的操作,可以得到i=1,j=1。如果在线程B unlock M之后,线程A才进入lock M,那么线程B就不一定能看到线程A中的操作,因此j的值就不一定是1。

 

public class  MutableInteger      {          private int value;                public int get(){              return value;          }          public void set(int value){              this.value = value;          }      }

 

以上代码中,get和set方法都在没有同步的情况下访问value。如果value被多个线程共享,假如某个线程调用了set,那么另一个正在调用get的线程可能会看到更新后的value值,也可能看不到。

     通过对set和get方法进行同步,可以使MutableInteger成为一个线程安全的类,如下:

 

public class  SynchronizedInteger      {          private int value;                public synchronized int get(){              return value;          }          public synchronized void set(int value){              this.value = value;          }      }

 

对set和get方法进行了同步,加上了同一把对象锁,这样get方法可以看到set方法中value值的变化,从而每次通过get方法取得的value的值都是最新的value值。

 

 

 

转载于:https://www.cnblogs.com/wenjieyatou/p/6209959.html

你可能感兴趣的文章
多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间 Options
查看>>
[转] prove, verify, bear out, demonstrate, confirm, validate, testify, certify 的区别
查看>>
三个Linux权限
查看>>
js,jquery获取checkbox 记录ID值
查看>>
Visual Studio 2013常用快捷键
查看>>
[SCOI2010]序列操作
查看>>
【★】自制网络心理需求大排名!
查看>>
Linux简介
查看>>
[Codevs 1690] 开关灯
查看>>
Linux下后台程序完成自动输入密码等交互行为的例子
查看>>
Java 基础【11】.class getClass () forName() 详解
查看>>
聊聊 Web 项目二维码生成的最佳姿势
查看>>
java程序如何向sqlserver中的Text类型字段插入数据?(img/text等等)
查看>>
.NET重构(一):抽象工厂模式实现登录
查看>>
CSS outline:none;是什么意思???
查看>>
文字拼音互转
查看>>
file_get_contents超时处理
查看>>
static和extern关键字1-对函数的作用
查看>>
无题5
查看>>
leetcode 392
查看>>