java中如何实现可重入的自旋锁

美女程序员鼓励师

说明

1、是指试图获得锁的线程不会堵塞,而是通过循环获得锁。

2、优点:减少上下文切换的消耗。

缺点:循环消耗CPU。

实例

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 {

                //此处无需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基础

本教程操作环境:windows7系统、java10版,DELL G3电脑。

以上是 java中如何实现可重入的自旋锁 的全部内容, 来源链接: utcz.com/z/544296.html

回到顶部