《Java并发编程实战》读书笔记-第3章 对象的共享

可见性

在没有同步的情况下,编译器、处理器以及运行时都可能做指令重排。执行结果可能会出现错误

volatile变量
编译器与运行时不会进行指令重排,不会进行缓存,使用volatile变量要满足以下条件:

  • 对变量的写入不依赖变量当前值,或者确保单个线程更新变量
  • 该变量不会与其他状态变量一起纳入不变性条件中
  • 在访问变量时不需要加锁
    加锁机制既可以确保可见性和原子性,而volatile变量只能确保可见性

发布与逸出

发布:使一个对象能够在当前作用域之外的代码中使用

  1. 将一个指向该对象的引用保存到其他代码可以访问的地方
  2. 在非私有的方法中返回该引用
  3. 将引用传递到其他类的方法中

逸出:当某个不应该发布的对象被发布时

线程封闭

实现线程安全的最简单方式之一:单线程内访问数据
****

  • Ad-hoc线程封闭
  • 栈封闭:局部变量
  • ThreadLocal类:ThreadLocal提供了get、set等接口,为每个使用该变量的线程都有一份独立的副本,因此get总是返回当前执行线程在调用set时设置的最新值。通常用于防止对可变的单实例变量或全局变量进行共享。

不变性

不可变对象一定是线程安全的。不可变对象需满足以下条件:

  • 对象创建以其状态不能修改
  • 对象所有域都是final类型
  • 对象创建时,this引用没有逸出

安全发布

并发程序共享对象策略:

  • 线程封闭(单线程拥有)
  • 只读共享(对外暴露只读)
  • 线程安全共享(内部实现同步,对外暴露接口)
  • 保护对象(加锁)

猜你喜欢

转载自www.cnblogs.com/zeekik/p/11735682.html