首页 > 编程知识 正文

分布式锁,重入锁怎么实现的

时间:2023-05-03 12:16:23 阅读:31442 作者:4089

译文: 3359 www.Shiyan Lou.com/questions/24601 .什么是可重锁的概念可以不怎么解释。 当一个线程a已经具有锁定并且线程b试图进入受该锁定保护的代码段时,其被阻止。 锁的操作粒度为“线程”,以下说明而不是调用“线程”) .当同一线程再次进入同步代码时.可以使用自己获取的锁的是内置于可重新调整的java中的锁(synchronize

2 .为什么可以重新进入

你说线程a会继续获取此锁定吗? 例如一个方法是同步,递归调用自己,第一次已经获得了锁,可以在第二次调用的时候进入吗? 直觉上当然需要可以访问。 为此,它必须是可重新访问的。 可重新访问的锁也称为递归锁,举个例子。

public class构件{ publicsynchronizedvoiddosomething { . } publicclassloggingwidgetextendswidget { publicsynchronizedvoidodoget //如果内建锁定是不可再允许的,就会发生死锁}}这个范例是java同步编程实战中的范例。 同步是父小部件的内置锁定,在运行子小部件的方法时获取一次小部件的锁定,然后在运行super时获取一次,否则获取一次

3 .一种实现重载锁定的方法,该方法将检索计数器与所有者线程与每个锁定相关联。 如果计数值为0,则任何线程都不具有此处。 当线程请求未保持的锁定时,JVM记下锁定的所有者,将获取的计数值设置为1,当同一线程再次获取此锁定时,技术值递增,结束一个同步代码块,计数值递减,计数值

4 .有不可重入锁吗? 这个还有。 缺省情况下,Linux上的pthread_mutex_t锁是非递归的。 可以通过设置PTHREAD_MUTEX_RECURSIVE属性将pthread_mutex_t锁定设置为递归锁定。 要自行实现不可重入锁定,对于同一可重入锁定,此计数器只能为1.0或0。 再次进入时,注意到已经是1而屏蔽。 jdk没有默认的实现类。

5 . demo代码指示5.1内置锁可重新输入

publicclassreentranttest { public void method1(} synchronized (reentrant test.class ) { System.out.println ) '方法1是重复的} public void method2((同步) reentranttest.class ) ({ System.out.println ) )方法1调用的方法2将重新放入内置锁中,并成功} publicstaticvoidmain (字符串[ ] args ) { new ReentrantTest ).method1); }} 5.2 lock对象可重新读取

import Java.util.concurrent.locks.lock; import Java.util.concurrent.locks.reentrant lock; publicclassreentrantlocktest {私有锁定=newreentrantlock (; 公共语音方法1 () { lock.lock ); try { System.out.println (方法已获取并运行ReentrantLock锁定); method2(; } finally { lock.unlock (); } }公共语音方法2 () { lock.lock ); try { System.out.println (方法1中调用的方法2进入ReentrantLock锁定并成功运行) ) } finally { lock.unlock (); } publicstaticvoidmain (字符串[ ] args ) { new ReentrantLockTest ).method1); (6.参考文章可以重新进入锁定测试

这是生产者更现实的例子

浅谈Java的摇滚

java同时编程实战

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。