怎样可以图文并发问题

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

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

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


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


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

发布了29 篇原创文章 · 获赞 4 · 访问量 7万+

我要回帖

更多关于 什么是并发 的文章

 

随机推荐