Java并行开发笔记1
程序员文章站
2022-05-22 18:05:05
...
加锁机制既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性。
当前仅当满足一下所有条件时,才应该使用volatile变量:
- 对变量的写入操作不依赖变量的当前值,或者你能确保只有单个线程更新变量的值。
- 该变量不会与其他状态变量一起纳入不变性条件中。
- 在访问变量时不需要加锁。
Ad-hoc 线程封闭是指,维护线程封闭性的职责完全由程序实现来承担。
不可变对象
但满足以下条件时,对象才是不可变的:
- 对象创建以后其状态就不能修改。
- 对象的所有域都是final类型。
- 对象是正确创建的。
要安全地发布一个对象,对象的引用以及对象的状态必须同时对其他线程可见。一个正确构造的对象可以通过以下方式来安全地发布:
- 在静态初始化函数中初始化一个对象引用。
- 将对象的引用保存大volatile类型的域或者AtomicReference对象中。
- 将对象的引用保存到某个正确构造对象definal类型域中。
- 将对象的引用保存到一个由锁保护的域中。
在并发程序中使用和共享对象时,可以使用一些实用的策略,包括:
- 线程封闭。 线程封闭的对象只能由一个线程拥有,对象被封闭在该线程中,并且只能由这个线程修改。
- 只读共享。 在没有额外同步的情况下,共享的只读对象可以由多个线程并发访问,但任何线程都不能修改它。共享的只读对象包括不可变对象和事实不可变对象。
- 线程安全共享。 线程安全的对象在其内部实现同步,因此多个线程可以通过对象的共有接口来进行访问而不需要进一步的同步。
- 保护对象。 被保护的对象只能通过持有特定的锁来访问。保护对象包括封装在其他线程安全对象中的对象,以及已发布的并且由某个特定锁保护的对象。