-
封闭
(1) 封装简化了线程安全类的实现过程。将数据封装在对象内部, 可以将数据的访问限制在对象的方法上, 从而更容易确保线程在访问数据时总能持有正确的锁
(2) 被封闭对象不能超出它们既定的作用域
1° 可以封闭在一个类实例中(private变量)
2° 可以封闭在某个作用域内(局部变量)
3° 封闭在线程内(只在同一个线程的不同方法内传递, 不在不同线程间传递)
-
可以使用对象的内置锁this对内部的对象进行封闭, 但是用其他的锁也可以, 只要确保使用了同一个锁。
对于不同的状态变量, 还可以使用不同的锁来增加灵活性
-
Java监视器模式
(1) 将对象的所有可变状态都封装起来, 并由对象的内置锁保护
(2) 示例
public class PrivateLock { private final Object myLock = new Object(); @GuardedBy("myLock") Widget widget; void someMethod() { synchronized (myLock) { // Access or modify the state of widget } } class Widget { } }
myLock就是内置锁
(3) 优点
私有的锁可以将锁封装起来,使客户代码无法得到锁
-
装饰器模式实现线程封闭
一些基本的容器类例如ArrayList不是线程安全的, 但是可以使用装饰器模式将容器类封装在一个同步的包装器对象中,而包装器将接口中的所有方法都实现为synchronized方法, 并将调用请求转发到底层的容器对象上(例如Collections.synchronizedList)