IT俱乐部 Java Java可重入锁的实现示例

Java可重入锁的实现示例

什么是可重入锁?

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

可重入锁案例

程序可重入加锁 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可重入锁内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!

本文收集自网络,不代表IT俱乐部立场,转载请注明出处。https://www.2it.club/code/java/9579.html
上一篇
下一篇
联系我们

联系我们

在线咨询: QQ交谈

邮箱: 1120393934@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部