商城网站建设如何,凡科网 小程序,网站主机安全,用手机可以做网站嘛0.概念理解
状态空间#xff1a;对象与变量所有可能的取值#xff0c;状态空间越小#xff0c;就越容易判断线程的状态#xff0c;final域用得越多#xff0c;就越能简化对象可能状态的分析过程#xff08;不可变对象只有唯一的状态#xff09;。 实例封闭#xff1a;…0.概念理解
状态空间对象与变量所有可能的取值状态空间越小就越容易判断线程的状态final域用得越多就越能简化对象可能状态的分析过程不可变对象只有唯一的状态。 实例封闭将数据封装在对象内部并且用锁来保护所有访问路径。 Java监视器模式一种编写代码的约定把对象的所有可变状态都封装起来并由对象自己的内置锁来保护优势在于其简单性进一步优化可以考虑使用私有锁对象使得客户代码无法得到锁。
1.为什么要考虑对象的组合
因为我们不希望每一次内存访问都进行线程安全性分析成本太高而是希望将一些现有的线程安全组件组合为更大规模的线程安全组件或程序。
2.在设计线程安全类的过程中需要考虑哪3个基本要素
1找出构成对象状态的所有变量引用其他对象则包含引用对象的域 2找出约束状态变量的不变性条件 3建立对象状态的并发访问管理策略。
3.同步策略的内涵是什么
1定义了如何在不违背对象不变性条件或后验条件的情况下对其状态的访问操作进行协同 2规定了如何将不可变性、线程封闭与加锁机制等结合起来以维护线程的安全性规定了哪些变量由哪些锁来保护 3要确保开发人员可以对这个类进行分析与维护同步策略必须被写为正式文档。
4.线程安全性的委托需要注意些什么
1单个安全的状态变量可直接委托 2多个彼此独立的安全状态变量在多个变量上不增加不变性条件可直接委托 3多个非独立状态变量需要做到以下2点 a. 通过加锁机制维护不变性条件 b. 避免发布状态变量到外部防止客户代码破坏不变性条件。 4把线程安全性委托给某个对象的底层状态变量时发布这些变量的条件 a. 变量本身是线程安全的 b. 没有任何不变性条件来约束它的值 c. 不存在任何不允许的状态转换。
其他需要注意的问题
跨线程的容器上下文对象例如ServletContext必须是线程安全的使用实例封闭机制时需要注意不要将对象发布到超出既定的作用域不要使对象逸出不可变的值可以被自由地共享与发布因此在同步方法中返回时不需要进行复制在为现有的线程安全类添加功能时扩展方法比直接将代码添加到类中更加脆弱因为现有的同步策略实现被分布到多个单独的源码文件中一旦父类修改使用了不同的锁来保护状态子类将被破坏。正确的方法是使用“组合”模式在外部使用Java监视器模式来封装现有的线程安全类多加一层锁带来的性能损失很小因为底层同步不存在竞争。