자바 자물쇠 의 유형 과 성질 (2): 자전 자물쇠 의 다른 종류
전편 에서 우 리 는 자 회전 자물쇠 에 세 가지 흔히 볼 수 있 는 자물쇠 형식 이 있다 고 말 했다.
Ticket Lock, CLHlock, MCSlock.
Ticket 잠 금 은 주로 방문 순서 문 제 를 해결 하 는데, 주요 문 제 는 다 핵 cpu 에 있 습 니 다.
package lock;
import java.util.concurrent.atomic.AtomicInteger;
public class TicketLock {
private AtomicInteger serviceNum =new AtomicInteger();
private AtomicInteger ticketNum = new AtomicInteger();
private static final ThreadLocal LOCAL = new ThreadLocal();
public void lock (){
int myticket = ticketNum.getAndIncrement();
LOCAL.set(myticket);
while(myticket!=serviceNum.get()){
}
}
public void unlock(){
int myticket = LOCAL.get();
serviceNum.compareAndSet(myticket, myticket+1);
}
}
serviceNum , ( , cpu )。
CLHLock MCSLock , ,
package lock;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
public class CLHLock {
public static class CLHNode {
private volatile boolean isLocked = true;
}
@SuppressWarnings("unused")
private volatile CLHNode tail;
private static final ThreadLocal LOCAL=new ThreadLocal();
private static final AtomicReferenceFieldUpdater UPDATER =AtomicReferenceFieldUpdater.newUpdater(CLHLock.class, CLHNode.class, "tail");
public void lock (){
CLHNode node=new CLHNode();
LOCAL.set(node);
CLHNode preNode = UPDATER.getAndSet(this, node);
if(preNode !=null){
while(preNode.isLocked){
}
preNode = null;
LOCAL.set(node);
}
}
public void unlock(){
CLHNode node = LOCAL.get();
if(!UPDATER.compareAndSet(this, node, null)){
node.isLocked = false;
}
node =null;
}
}
CLHlock , NUMA ( , )
MCSLock 。 CLHlock 。
package lock;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
public class MCSLock {
public static class MCSNode {
volatile MCSNode next;
volatile boolean isLocked = true;
}
private static final ThreadLocal NODE = new ThreadLocal();
@SuppressWarnings("unused")
private volatile MCSNode queue;
private static final AtomicReferenceFieldUpdater UPDATER =AtomicReferenceFieldUpdater.newUpdater(MCSLock.class, MCSNode.class, "queue");
public void lock(){
MCSNode currentNode = new MCSNode();
NODE.set(currentNode);
MCSNode preNode = UPDATER.getAndSet(this, currentNode);
if(preNode!=null){
preNode.next = currentNode;
while(currentNode.isLocked){
}
}
}
public void unlock(){
MCSNode currentNode = NODE.get();
if(currentNode.next == null){
if(UPDATER.compareAndSet(this, currentNode, null)){
}else{
while(currentNode.next==null){
}
}
}else{
currentNode.next.isLocked = false;
currentNode.next =null;
}
}
}
,CLH MCS ,
CLH , 。
MCS , 。
JUC ReentrantLock CLH ( , )。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java. util. concurrent 패키지 의 해체@Date 2019-7-8 11:25*/public class BlockingQueueExample {public static void main(String[] args) {BlockingQueue blockingQ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.