线程同步中的双重检查:
在对一个非同步成员变量进行访问时,如果调用者发现读到了非法成员变量的时候,可以采取相应的措施。这样的措施之一就是在同步的环境下重新访问这个成员变量,判断一下它的最新值,然后采取恰当的行动。
1. 独立的对象锁的声明是: 将该对象声明为final类型的对象实体。
public class LinkedQueue ... { protected Node head = new Node(null); protected Node last = head; protected final Object pollLock = new Object(); protected final Object pullLock = new Object(); public void put(Object x) ...{ Node node = new Node(x); synchronized (pullLock) ...{ synchronized(last) ...{ last.next = node; last = node; } } } public Object poll() ...{ synchronized(pollLock) ...{ synchronized(head) ...{ Object x = null; Node first = head.next; if (first != null) ...{ x = first.object; first.object = null; head = first; } return x; } } } //Local node class for queue static class Node ...{ Object object; Node next = null; Node(Object x)...{ object = x;} }}分析:
1. 该代码块利用了三个锁,2个单独的锁,一个共享锁;这个共享锁需要特别注意:其仅仅出现在当队列为空,
即当头尾指向同一个元素的时候,这个共享锁就会发挥读取实现锁互斥。
2. 单独的2个锁实现基于2个不同的对象,分别基于final类型的对象
只读适配器
原理: 实现以只读的方式将信息传递出去
建立的基本步骤如下:
a. 定义一个基本的interface,用来描述一些不变性的功能
b. 作为可选功能,可以定义一个子接口来支持在通常可变的实现类中用以更新的方法
c. 定义一个只读适配器, 该适配器只传递接口中定义的操作。为了增加安全性,可以把不变类声明为final.使用
final成员变量进行声明。