首页天道酬勤java 自旋锁,什么是自旋锁

java 自旋锁,什么是自旋锁

张世龙 05-04 18:11 38次浏览

CLH队列CLH队列中的节点QNode具有锁定字段。 如果此字段为true,则表明线程需要获得锁定,并且不会解除锁定;如果为false,则线程解除锁定。 节点之间用看不见的链表连接。 之所以称为不可见的链表,是因为这些节点之间没有明显的next指针,myPred指向的节点变化会影响myNode的行为。 CLHLock有一个始终指向队列中最后一个节点的末尾指针

如果线程需要获取锁定,则会创建新的QNode。 如果其中的locked设置为true,则表示需要获取锁定。 然后,线程对tail域调用getAndSet方法以在队列末尾获取对上一个节点的引用myPred,该线程在上一个节点的locked字段中旋转直到解锁。 如果线程需要解除锁定,请将当前节点的locked域设置为false,以重用前向节点。 如下图所示,线程a需要获取锁定。 myNode域为true,tail指向线程a的节点,线程b也添加在线程a之后,tail指向线程b的节点。 接着,线程a和b在其myPred域上旋转,并且当其myPred节点的locked字段变为false时,可以获得锁定扫描行。 很明显,线程a的myPred locked域为false,此时线程a获得了锁定

package com.example.demo.pojo; import Java.util.concurrent.atomic.atomic reference; classnode { privatevolatilebooleanlocked; 公共布尔锁定() { return locked; } publicvoidsetlocked (布尔锁定) { this.locked=locked; } }公共类clhqueue {//团队的最后一个AtomicReferenceNode tail; //前驱的热本地节点预成型节点; //当前节点ThreadLocalNode curNode; publicclhqueue ((tail=newatomicreference ) ); pred node=new thread local { @ overrideprotectednodeinitialvalue } { return null; }; curnode=new thread local { @ overrideprotectednodeinitialvalue } { return new node } }; }; }publicvoidacquired(((/获取当前线程的节点将首次自动初始化Node cur=curNode.get ) )。 //在团队末尾插入system.out.println (thread.current thread ().getName ) ) '在团队末尾插入); 节点pred=tail.getan dset (cur; prednode.set(pred ); while (! pred.isLocked () ) { Thread.yield ); } system.out.println (thread.current thread ().getName ) (“获取锁定”); } public void release () { Node cur=curNode.get ); cur.setlocked(false ); //从队列curnode.set中删除当前节点(prednode.get ); }

两个栈实现一个队列java,java怎么处理高并发