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://myzitong.com/article/jposec.html