public class ReentrantSpinLock {
private AtomicReference<Thread> owner =
new
AtomicReference<>();
private int count = 0;
public void lock() {
Thread current = Thread.currentThread();
if
(owner.get() == current) {
count++;
return
;
}
while
(!owner.compareAndSet(
null
, current)) {
System.out.println(
"--我在自旋--"
);
}
}
public void unLock() {
Thread current = Thread.currentThread();
if
(owner.get() == current) {
if
(count > 0) {
count--;
}
else
{
owner.set(
null
);
}
}
}
public static void main(String[] args) {
ReentrantSpinLock spinLock =
new
ReentrantSpinLock();
Runnable runnable = () -> {
System.out.println(Thread.currentThread().getName() +
"开始尝试获取自旋锁"
);
spinLock.lock();
try
{
System.out.println(Thread.currentThread().getName() +
"获取到了自旋锁"
);
Thread.sleep(4000);
}
catch
(InterruptedException e) {
e.printStackTrace();
} finally {
spinLock.unLock();
System.out.println(Thread.currentThread().getName() +
"释放了了自旋锁"
);
}
};
Thread thread1 =
new
Thread(runnable);
Thread thread2 =
new
Thread(runnable);
thread1.start();
thread2.start();
}
}