栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

浅谈可重入锁

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

浅谈可重入锁

一、可重入锁(递归锁)

1、概念:同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提是:锁对象是同一个对象),不是因为之前已经获取过还没有释放而阻塞

2、java中的ReentrantLock和synchronied都是可重入锁,可重入锁的一个优点就是可以在一定程度上避免死锁的出现

二、可重入锁的种类 一、隐式锁(Synchronized关键字使用的锁)默认是可重入锁
public class ReEnterLockDemo {
    public synchronized void m1(){
        System.out.println("外");
        m2();//当获取到锁时,由于是同一个对象,所以在进入m2时可以直接进入,这就是可重入锁
    }
    public synchronized void m2(){
        System.out.println("中");
        m3();
    }
    public synchronized void m3(){
        System.out.println("内");
    }
    public static void main(String[] args) {
        new ReEnterLockDemo().m1();
    }
}

Synchronized的重入实现机制:

每个锁对象拥有一个锁计数器和一个指向持有该锁的线程的指针。

当执行monitorenter时,如果目标对象的计数器为零,你那么说明他没有被其他线程锁持有。java虚拟机会将锁对象的持有线程设置为当前线程。并且将其计数器加一。

(进入另一个带锁的方法或代码块中)在锁对象的计数器不为零的情况下,如果锁对象的持有线程是当前线程,那么java虚拟机可以将其计数器加一,否则需要等待,直至持有线程释放该锁。

当执行monitorexit时,java虚拟机则需要将锁对象计数器减一,当锁对象计数器为零时,代表锁已被释放。

二、显式锁(即Lock锁)也有ReentranLock这样的可重入锁
public class ReEnterLockDemo2 {
    static Lock lock = new ReentrantLock();
    public static void main(String[] args) {

        new Thread(()->{
            lock.lock();
            try {
                System.out.println("外层");
                lock.lock();
                try {
                    System.out.println("中层");
                }finally {
                    lock.unlock();//加几次锁就要释放几次锁
                }
            }finally {
            lock.unlock();
            }
        }).start();
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/716241.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号