序文:
如果你没有时间阅读这本,那你就来对地方了。小编会将每一章刨去废话,取其精华。分享给大家。如果觉得可以请不要忘了关注小编。我会定期跟新java 中的经典书籍。
正文:
第四章:对象的组合(更加适用的线程安全)
1.自己创建一个线程安全类,要考虑很多(发布是否逸出,是否可见,全部状态-包括自身的变量和对象引用中的变量是否线程安全等),不如在使用的时候进行封装。
2.当多个变量之间休要判断修改时,那么就得在一个原子操作中:不能首先修改一个值,然后释放锁并再次获得相同的锁修改另一值,这样也是不安全的。
3.如果某对象不是线程安全的,那么可以通过多种技术使其在多线程程序中安全的使用。(本章重点思想)
通过封闭机制(前章中提及-栈封闭-线程封闭)与合适的加锁策略结合起来,可以确保以线程安全的方式来使用非线程安全对象。
4.实例封闭:
将书籍封装在对象内部,可以将书籍的访问权限设置在对象方法上(get set),从而更容易确保线程访问数据时持有正确的锁。(避免逸出)
例如:作为类的私有成员(封装性),作为一个局部变量(栈封闭),封闭在线程内在方法之间传递(线程封闭)
下面的代码Person可能是不安全的,指定集合中添加 和 获取(可以添加类似的方法)都是安全的。(但是不代表从集合中获取的Person 这个对象就是安全的)
public class PersonSet{ private final Set
myset=new HashSet
(); public synchronized void addPerson(Person p){ myset.add(p); } public synchronized boolean containsPerson(Person p){ return myset.contains(p); }
5.java 内置所也称为监视器锁(前文提及过)
Java监视器模式仅仅是一种编写代码的约定,对于任何一种锁对象,只要自始至终都使用该锁都系昂都可以用来保护对象的状态。
可以使用私有锁来确保使用一个锁对象:私有锁对象可以将锁封装起来,使客户端无法得到锁,但是客户端代码可以通过公有方法来访问锁,以便参与到同步策略中。
6.在线程安全的类中添加新功能
直接在源代码中修改(最佳,这样可以使用相同的同步策略)
继承的方式(脆弱)
7.链表总方法锁,是不同的对象锁,所以不能保证线程安全。可以使用私有锁。
8.组合:为先有类中添加原子操作的跟好的方法。
就是写一个类提供安全的读 改 线程安全的方法。并且维护一个集合。
这样可以将对象存入到这个类的集合中。
9.文档化:将对应需要确保线程安全的状态进行说明,以便于以后维护。
领取专属 10元无门槛券
私享最新 技术干货