자바 자물쇠 의 유형 과 성질 (2): 자전 자물쇠 의 다른 종류

4980 단어 병발 하 다JAVA
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 ( , )。

좋은 웹페이지 즐겨찾기