上一篇:Java并发编程实战(一)
安全发布
- 安全的发布一个对象,对象的引用以及对象的状态必须同时对其它线程可见。一个正确构造的对象可以通过以下方式来安全发布:
- 在静态初始化函数中初始化一个对象引用
- 将对象的引用保存到 volatile 类型的域或者 AtomicReferance 对象中
- 将对象的引用保存到某个正确构造对象的 final 类型域中
- 将对象的引用保存到一个由锁保护的域中
不可变对象
- 定义:
- 如果某个对象在被创建后其状态就不能被改变,那么这个对象就称为
不可变对象
。 - 当满足一下条件时,对象才是不可变的:
- 对象创建以后其状态就不能被改变
- 对象的所有域都是 final 类型
- 对象是正确创建的(在对象的创建期间,this 引用没有逸出)
- 如果某个对象在被创建后其状态就不能被改变,那么这个对象就称为
事实不可变对象
- 定义:
- 在没有额外的同步情况下,任何线程都可以安全地使用被
安全发布的
事实不可变对象。
- 在没有额外的同步情况下,任何线程都可以安全地使用被
- 总结:
- 事实不可变对象 只会被读
可变对象
- 定义:
- 可变对象必须通过安全方式来发布(“发布当时”状态的可见性),并且必须是线程安全的或者由某个锁保护起来(每次对象访问时同样需要使用同步来确保后续修改操作的可见性)。
并发程序中使用和共享对象时,实用策略:
- 线程封闭
- 线程封闭的对象只能由一个线程拥有,对象被封闭在该线程中,并且只能由这个线程修改
- 只读共享
- 在没有额外同步的情况下,共享的只读对象可以由多个线程并发访问,但任何线程都不能修改它。共享的只读对象包括
不可变对象
和事实不可变对象
- 在没有额外同步的情况下,共享的只读对象可以由多个线程并发访问,但任何线程都不能修改它。共享的只读对象包括
- 线程安全共享
- 线程安全的对象在其
内部实现同步
,因此多个线程可以通过对象的公有接口来进行访问而不需要进一步的同步
- 线程安全的对象在其
- 保护对象
- 被保护对象只能通过持有特定的锁来访问。保护对象包括封装在其它线程安全对象中的对象,以及已发布的并且由某个特定锁保护的对象。