package com.chaohu.lock;
import java.util.concurrent.atomic.AtomicReference;
/**
* 题目:实现一个自旋锁
* 自旋锁好处:循环比较获取,直到成功位置,没有类似wait的阻塞
*
* 通过CAS操作完成自旋锁,A线程先进来调用mylock方法自己持有5秒钟,
* B随后进来后发现当前线程持有锁,不是null。所以只能通过自选等待,
* 直到A释放锁后B随后抢到。
*/
public class SpinLockDemo {
public static void main(String[] args) {
SpinLockDemo spinLockDemo = new SpinLockDemo();
new Thread(new Runnable() {
@Override
public void run() {
spinLockDemo.myLock();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
spinLockDemo.myUnLock();
}
},"AA线程").start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(new Runnable() {
@Override
public void run() {
spinLockDemo.myLock();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
spinLockDemo.myUnLock();
}
},"BB线程").start();
}
//原子引用线程(引用类型不写默认null)
AtomicReference<Thread> atomicReference = new AtomicReference<>();
public void myLock(){
Thread thread = Thread.currentThread();
System.out.println(thread.getName() + " 我进来啦0(0.0)0");
while (!atomicReference.compareAndSet(null,thread)){}
}
public void myUnLock(){
Thread thread = Thread.currentThread();
atomicReference.compareAndSet(thread,null);
System.out.println(thread.getName() + " 我出来啦0(0.0)0");
}
}
手写一个自旋锁
最新推荐文章于 2024-06-21 17:14:47 发布