自定义实现CAS自旋锁
本篇文章利用原子引用类自定义实现的自旋锁
new 一个原子引用类,对象类型为Thread
AtomicReference<Thread> atomicReference = new AtomicReference<>();
加锁方法,通过while不断自旋,设置当前线程
public void MyCASLock(){
System.out.println(Thread.currentThread().getName()+"尝试获取锁!");
while (!atomicReference.compareAndSet(null,Thread.currentThread())){
// System.out.println(Thread.currentThread().getName()+"尝试中!");
}
System.out.println(Thread.currentThread().getName()+"获取锁成功!");
}
解锁方法,直接把线程设置为空
public void MyCASUnLock(){
atomicReference.compareAndSet(Thread.currentThread(),null);
System.out.println(Thread.currentThread().getName()+"解锁!");
}
用三个线程测试
AQSTest aqsTest = new AQSTest();
new Thread(()->{
aqsTest.MyCASLock();
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("AAA执行中");
aqsTest.MyCASUnLock();
},"AAA").start();
new Thread(()->{
aqsTest.MyCASLock();
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("BBB执行中");
aqsTest.MyCASUnLock();
},"BBB").start();
new Thread(()->{
aqsTest.MyCASLock();
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("CCC执行中");
aqsTest.MyCASUnLock();
},"CCC").start();
结果
AAA尝试获取锁!
AAA获取锁成功!
BBB尝试获取锁!
CCC尝试获取锁!
AAA执行中
AAA解锁!
CCC获取锁成功!
CCC执行中
CCC解锁!
BBB获取锁成功!
BBB执行中
BBB解锁!