只读共享

前面讲了保证线程安全的两种思路:安全的共享(保证同步)和线程封闭(不共享也就不存在线程安全的问题)。还有一种思路是共享只读的数据(不可更改当然没有一致性的问题)。并发编程书中强调了不可变对象一定是线程安全的

不可变对象需要满足的条件:

  • 对象创建后状态不可更改
  • 对象的所有域都是final类型(如果所有域不会逸出的话,也可以不是final,但是保险起见)
  • 对象在创建期间没有逸出
//并发编程书中一个不可变对象的例子
public class FinalClass {
    private final Set<String> stooges = new HashSet<String>();
    public FinalClass() {
        stooges.add("one");
        stooges.add("two");
        stooges.add("three");
    }
    public boolean isStooge(String name){
        return stooges.contains(name);
    }
}

总结

并发程序中使用和共享对象时的策略:

  1. 线程封闭:线程封闭的对象只能由一个线程拥有,对象封闭在该线程中,并且只能由这个线程共享,例如:使用栈封闭,ThreadLocal类
  2. 只读共享:使用不可变的对象,多个线程可以共享访问,但是都不能改变它。
  3. 线程安全共享:使用volatile,synchronized设计类
  4. 保护对象:将需要线程安全的对象封装在其他对象中,使用内部对象的数据时必须获得外部对象的锁。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值