实现:



用Java原子变量的CAS方法实现一个自旋锁_自旋锁

package sjq.mylock;

import java.util.concurrent.atomic.AtomicReference;

public class SpinLock {
private AtomicReference<Thread> owner = new AtomicReference<>(); //不调用有参构造函数,则实例为null

public void lock(){
Thread currentThread = Thread.currentThread();
while(!owner.compareAndSet(null, currentThread)){ // owner == null ,则compareAndSet返回true,否则为false。
//拿不到owner的线程,不断的在死循环
}
}

public void unLock(){
owner.set(null);
// 也可以这样写,太麻烦,没必要
/*
Thread cur = Thread.currentThread();
owner.compareAndSet(cur, null);
*/
}

}


用Java原子变量的CAS方法实现一个自旋锁_java_02


 

 

测试:



用Java原子变量的CAS方法实现一个自旋锁_主线程_03

package sjq.mylock;

import java.util.concurrent.CountDownLatch;

import org.junit.Test;

public class TestSpinLock {

final static int THREAD_NUM = 100;
static int x = 0;

@Test
public void testLock() throws InterruptedException {
CountDownLatch latch = new CountDownLatch(THREAD_NUM);

// 锁
SpinLock spinLock = new SpinLock();

for (int i = 0; i < THREAD_NUM; i++) {
// 启动子线程
new Thread(() -> {

// 每个线程循环多次,频繁上锁,解锁。
for (int n = 0; n < 100; n++) {
spinLock.lock();
x++;
spinLock.unLock();
}

latch.countDown(); // 子线程通知主线程,工作完毕。
}).start();
}
latch.await(); // 主线程等待所有子线程结束。

System.out.println(x); // 最终打印结果:10000 ,未出现线程不安全的异常。
}
}