线程独占笔记

    技术2022-05-11  28

     线程同步中的双重检查:

        在对一个非同步成员变量进行访问时,如果调用者发现读到了非法成员变量的时候,可以采取相应的措施。这样的措施之一就是在同步的环境下重新访问这个成员变量,判断一下它的最新值,然后采取恰当的行动。

    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成员变量进行声明。


    最新回复(0)