• 技术文章 >java >java基础

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

    小妮浅浅小妮浅浅2021-07-12 10:00:48原创2666

    说明

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

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

    缺点:循环消耗CPU。

    实例

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    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 自旋锁
    上一篇:java使用Semaphore实现限流器 下一篇:Java如何在PDF添加注释

    相关文章推荐

    • python多线程死锁问题处理• MongoDB使用什么类型的锁?• java中锁的概念介绍• python多线程线程锁如何使用• Java中锁有哪些面试题• java中lock获取锁的四种方法• Java中锁有哪些面试题?• python使用互斥锁处理资源分配• Python死锁的产生原因• Python获取GIL锁的流程• java内置锁的可重入性• java使用JConsole检测死锁• java线程池死锁的产生及处理

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网