欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java可重入锁的实现示例,

来源: javaer 分享于  点击 44514 次 点评:122

Java可重入锁的实现示例,


目录
  • 什么是可重入锁?
  • 可重入锁案例
    • sychronized锁
    • ReentrantLock
  • 如何保证可重入

    什么是可重入锁?

    当线程获取某个锁后,还可以继续获取它,可以递归调用,而不会发生死锁;

    image-20230728110933738

    可重入锁案例

    程序可重入加锁 A.class,没有发生死锁。

    sychronized锁

    package com.wnhz.lock.reentrant;
    
    public class SychronizedDemo {
    
        class A {
            void a() {
    
            }
        }
    
        class B {
            void b() {
            }
        }
    
        public static void main(String[] args) {
            System.out.println("准备锁住class A >>>>");
            synchronized (A.class) {
                System.out.println("锁住class A--> 成功");
                System.out.println("准备再次锁住class A >>>>");
                synchronized (A.class) {
                    System.out.println("锁住class A--> 成功");
                }
                System.out.println("释放class A");
            }
        }
    }
    

    运行结果

    准备锁住class A >>>>
    锁住class A--> 成功
    准备再次锁住class A >>>>
    锁住class A--> 成功
    释放class A

    ReentrantLock

    package com.wnhz.lock.reentrant;
    
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class ReentrantLockDemo {
    
        private static final Lock lock = new ReentrantLock();
        class A {
            void a() {
            }
        }
    
        class B {
            void b() {
            }
        }
    
        public static void main(String[] args) {
            System.out.println("准备锁住class A >>>>");
            lock.lock();
            try {
                System.out.println("锁住class A--> 成功");
                System.out.println("准备再次锁住class A >>>>");
                lock.lock();
                try {
                    System.out.println("锁住class A--> 成功");
                } finally {
                    System.out.println("释放第二次锁住的class A");
                }
            } finally {
                lock.unlock();
                System.out.println("释放第一次锁住的Class A对象");
            }
        }
    }
    

    运行结果

    准备锁住class A >>>>
    锁住class A--> 成功
    准备再次锁住class A >>>>
    锁住class A--> 成功
    释放第二次锁住的class A
    释放第一次锁住的Class A对象

    如何保证可重入

    当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储偏向的线程ID,以后该线程在进入和退出同步块时不需要进行CAS操作来加锁和解锁,只需简单测试一下对象头的Mark Word里是否存储着指向当前线程的偏向锁。如果测试成功,表示线程已经获得了锁。如果测试失败,则需要再测试一下Mark Word中偏向锁标志是否设置成1:没有则CAS竞争;设置了,则CAS将对象头偏向锁指向当前线程。再维护一个计数器,同个线程进入则自增1,离开再减1,直到为0才能释放。

    到此这篇关于Java可重入锁的实现示例的文章就介绍到这了,更多相关Java可重入锁内容请搜索3672js教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持3672js教程!

    您可能感兴趣的文章:
    • Java锁之可重入锁介绍
    • Java源码解析之可重入锁ReentrantLock
    • Java可重入锁的实现原理与应用场景
    • 简单了解Java中的可重入锁
    • 一篇文章让你彻底了解Java可重入锁和不可重入锁
    • Java可重入锁ReentrantLock详解
    • Java中的可重入锁ReentrantLock简析
    • Java可重入锁reentrantLock解析
    相关栏目:

    用户点评