java中怎么实现可重入的自旋锁
这篇文章主要介绍了java中怎么实现可重入的自旋锁的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java中怎么实现可重入的自旋锁文章都会有所收获,下面我们一起来看看吧。

无锡ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:13518219792(备注:SSL证书合作)期待与您的合作!
说明
1、是指试图获得锁的线程不会堵塞,而是通过循环获得锁。
2、优点:减少上下文切换的消耗。
缺点:循环消耗CPU。
实例
public class ReentrantSpinLock {
private AtomicReference 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 {
//此处无需CAS操作,因为没有竞争,因为只有线程持有者才能解锁
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();
}
} 关于“java中怎么实现可重入的自旋锁”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“java中怎么实现可重入的自旋锁”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注创新互联行业资讯频道。
网站栏目:java中怎么实现可重入的自旋锁
网站地址:http://www.jxjierui.cn/article/jposec.html


咨询
建站咨询
