首页 > 编程知识 正文

重入锁和不可重入锁,可重入函数和不可重入函数

时间:2023-05-05 21:16:32 阅读:31443 作者:4307

可重入锁的示例(同一线程不能重入锁定的代码段)是不可重入锁的逻辑过程,如下所示: 运行main方法控制台时,将打印执行doJob方法之前的内容,然后一直阻止线程,并且在doJob方法运行时不打印。 这是因为第一个锁定未解除,所以在执行第一个锁定后,在isLocked=true的情况下,调用了doJob ()内部并再次锁定) ),但上一个线程已锁定线程正在运行system.out.println('dojob方法'); 由于此代码,控制台只能在执行doJob方法之前打印。 这种现象造成了不可重新锁定

公共类计数{ my lock lock=new my lock (; publicstaticvoidmain (字符串[ ] args ) throwsinterruptedexception (new count ).doSomeThing ); //示例的main方法}公共void do something (throwsinterruptedexception ) lock.lock ); //system.out.println (在执行' dojob方法之前); doJob (; //在方法内重新锁定lock.unlock (; //解除最初施加的锁定(} public void doJob ) ) Throwsinterruptedexception (锁定. lock ); system.out.println (正在执行' dojob方法'); lock.unlock (; }}/** *自定义锁定*/class my lock { privatebooleanislocked=false; publicsynchronizedvoidlock (throwsinterruptedexception ) while (已锁定) { wait ); } isLocked=true; //线程第一次进入时将器设置为true,第二次进入where true进入死循环}公共同步语音解锁() { isLocked=false; //将此值设置为false的目的是锁定notify (); //接触块}}可重读锁定的示例(同一线程可以重读到锁定的代码段中,但不同线程必须阻止)对于java可重读锁定,请使用:ReentrantLock显式重读锁定

可重入锁旨在防止类似上述不可重入锁的情况,并防止同一线程重入锁代码段。

目的是允许同一线程再次进入锁定代码段。

可重锁示例代码的设计

publicclassmyreentrantlock { booleanislocked=false; //默认情况下未锁定的Thread lockedBy=null; //记录块线程int lockedCount=0锁定次数计数/** *锁定逻辑*/publicsynchronizedvoidlock (throwsinterrruptedexception //锁定且相同的线程则释放,否则其他线程进入where循环并进入while(islockedlockedby!=thread () { wait ); } isLocked=true; //第一次进入时进行锁定计数; //锁定次数计数lockedBy=thread; //当前阻止的线程} /** *解锁逻辑*/public synchronized void unlock () if ) thread.currentthread )==this.lockedBy ) 如果锁定次数减少1if (锁定计数==0) /计数为0,则意味着所有线程释放了锁定isLocked=false; //真的释放所有锁定notify (); } } }}

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