自旋锁代码好像存在同时获取到锁的问题
来源:6-5 在自旋锁的应用

端碗吹水
2020-04-04
public class SpinLock {
private AtomicReference<Thread> sign = new AtomicReference<>();
public void lock() {
Thread current = Thread.currentThread();
// 自旋
while (!sign.compareAndSet(null, current)) {
}
}
public void unlock() {
Thread current = Thread.currentThread();
sign.compareAndSet(current, null);
}
public static void main(String[] args) {
SpinLock spinLock = new SpinLock();
Runnable r = () -> {
System.out.println(Thread.currentThread().getName() + "开始尝试获取自旋锁");
spinLock.lock();
try {
System.out.println(Thread.currentThread().getName() + "获取到了自旋锁");
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
spinLock.unlock();
System.out.println(Thread.currentThread().getName() + "释放了自旋锁");
}
};
new Thread(r).start();
new Thread(r).start();
}
}
会有同时获取到锁的情况,JDK版本是11:
写回答
1回答
-
会不会是在线程0执行spinLock.unlock()释放锁后,还没有打印出“释放了自旋锁”,线程2就先拿到了锁并且打印出了“获取到自旋锁”,实际上此时线程0已经释放了锁。
032020-04-06
相似问题