博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
安全发布的模式
阅读量:4650 次
发布时间:2019-06-09

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

  如果线程A将对象X置入某个线程安全器,随后线程B重新获得X,这时可以保证B看到的X的状态,一定正是A设置的。

  为了安全的发布对象,对象的引用以及对象的状态必须同时对其他线程可见。

  1、通过静态初始化器初始化对象的引用;

  2、将它的引用存储到volatile域活AtomicReference;

  3、将它的引用存储到正确创建的对象的final域中;

  4、将它的引用存储到由锁正确保护的域中。

  

  以下情况符合安全发布:

    1、置入Hashtable、synchronizedMap、ConcurrentMap中的主键以及键值,会安全地发布到可以从Map获得它们的任意线程中,无论是直接获得还是通过迭代器(iterator)获得;

    2、置入Vector、CopyOnWriteArrayList、CopyOnWriteArraySet、synchronizedList或者synchronizedSet中的元素,会安全地发布到可以从容器中获得它的任意线程中;

    3、置入BlockingQueue或者ConcurrentLinkedQueue的元素,会安全地发布到可以从队列中获得它的任意线程中。

  

  任何线程都可以在没有额外的同步下安全地使用一个安全发布的高效不可变对象。

  比如,Date自身是可变的,但是如果你把它当作不可变对象来使用就可以忽略锁。否则,每当Date被跨域线程共享时,都要用锁确保安全。

  假设你正在维护一个Map,它存储了每位用户的最近登录时间:

    

public Map
lastLogin = Collections.synchronizedMap(new HashMap
());

  

转载于:https://www.cnblogs.com/buaixianchen/archive/2011/09/15/2177865.html

你可能感兴趣的文章
Python logger模块
查看>>
jquery控制css的display(控制元素的显示与隐藏)
查看>>
关于python做人工智能的一个网页(很牛逼)
查看>>
判断控件的CGRect是否重合,获取控件的最大XY值
查看>>
POJ-1128 Frame Stacking
查看>>
python第三十九课——面向对象(二)之初始化属性
查看>>
GET请求在Tomcat中的传递及URI传递
查看>>
Far manager界面混乱问题解决
查看>>
Go数组和切片定义和初始化
查看>>
mysql 5.7 二进制安装方法
查看>>
JavaScript 复杂判断的更优雅写法借鉴
查看>>
<mvc:annotation-driven/>浅析
查看>>
ArcEngine开发之自定义工具
查看>>
SQL视频总结
查看>>
P4878 道路修建-美国
查看>>
dp练习
查看>>
vim
查看>>
maze_travel的隐私声明
查看>>
对正则表达式又重新学了一遍,笔记方便以后查阅
查看>>
UIKit应用 - Swift 版本: 3.让UITableViewCell的背景色渐变
查看>>