Enq comprensión del método de la AQS

Propia mudo, siempre se sintió un poco alrededor, terminando al lado de ella ~

private Node enq(final Node node) {
	//自旋锁
    for (;;) {
        //tail默认就是null
        Node t = tail;
        if (t == null) { // Must initialize
            //因为tail默认是null,所以首次一定会进来
            //compareAndSetHead在下面
            //也就是首次一定会把一个新的node设置为head
            if (compareAndSetHead(new Node()))
                //tail=head=new Node()
                tail = head;
            //到这里就是tail和head都会指向new Node
        } else {
            //第二次一定进入else发
            //假如此时进入了一个线程A,这个A已经被封装成了node传进来
            //当前的node的pre指向t,也就是tail,也就是刚才创建的Node,
            //因为第一行就定义了Node t = tail,而t=head=node
            node.prev = t;
            //这里看下面的compareAndSetTail方法
            //把tail节点赋值为新传入的node(Thread A),赋值操作就相当于指向
            if (compareAndSetTail(t, node)) {
                //这里的t指的是原来的tail节点,tail指向一开始的new Node
                //所以就是new Node的next指向新传入的node(Thread A)
                t.next = node;
                return t;
            }
        }
    }
}


private final boolean compareAndSetHead(Node update) {
    //当前的head字段,和null值比对,默认是null,所以相等,所以赋值为update,也就是new node()
    return unsafe.compareAndSwapObject(this, headOffset, null, update);
}


private final boolean compareAndSetTail(Node expect, Node update) {
    //当前的tail字段和期望值exepct,即t进行比较,一定是相等的啊,以为t=tail么,所以更新赋值为update,
    //即新传进来的node(Thread A)
    return unsafe.compareAndSwapObject(this, tailOffset, expect, update);
}

El primero se deben introducir si

Aquí Insertar imagen Descripción

Cuando un nuevo hilo para entrar al entrar en otro sitio (de hecho, ningún nuevo hilo entrar o punto de entrar de otra persona), el rojo es el operativo más lo hizo

Aquí Insertar imagen Descripción

resumen:

Cabeza y la cola hay un nodo, pero aquí me entiende como algo similar a un puntero, el sentido de su existencia, sino también para mantener esta lista enlazada de dos vías, no tiene importancia práctica, incluyendo el anterior y el siguiente también.

Muy a su alrededor, no siento ninguna necesidad de ser tan completa comprensión de la idea principal es

El primero llegó en el aire para crear una lista doblemente enlazada de nodos, el nuevo tiempo pase hacia atrás nodo, de vuelta de dos vías para el comienzo de la lista para agregar nuevos nodos, y la cabeza y la cola siempre apunta a la primera y la última, son algunas de la mitad puntero de conmutación (estoy aquí por el momento se entienda como un puntero a ella, que es el operador de asignación, como la asignación de la cola asignación y la cabeza, anterior y el siguiente.)

for (;;) es un spin-lock, sin parar para tratar de añadir nodos, pero puede haber problemas de concurrencia, por lo que a través cas, complemento, puede ser la última vez que un hilo para tomar la iniciativa, esta vez él está todavía en curso trate, la forma de seguir intentando? Así resuelto a través de bloqueo de giro, por supuesto, si se agrega el resultado final aparecerá bloqueo de bucle de retorno.

Personalmente creo que este cas bloqueo de número y operación con muy poderoso, es el aprendizaje vale la pena!

Todo lo anterior es mi entendimiento personal, puede haber un gran problema, espero que no inducir a error, si hay problemas también quieren que señalar sin demora.

Publicados 540 artículos originales · ganado elogios 3050 · Vistas 2.5 millones +

Supongo que te gusta

Origin blog.csdn.net/dataiyangu/article/details/104881208
Recomendado
Clasificación