java开发非公平锁不可打断的源码怎么写


今天小编给大家分享一下java开发非公平锁不可打断的源码怎么写的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。保证线程1先获取到锁,睡眠10分钟,因为需要打断点,线程2再去获取锁。addWaiter方法的第一个参数是mode,Node.EXCLUSIVE是个null。acquireQueued方法的第一个参数是node,其实就是线程2所在的Node节点。第二个参数是1:代表了本次state加锁成功累加的数量。由于acquireQueued方法的参数是addWaiter方法的返回值,因此先看addWaiter方法注意 是否需要进入park阻塞是由当前节点的前驱节点的waitStatus == Node.SIGNAL 来决定,而不是本节点的waitStatus 决定。目前头结点的waitStatus==Node.SIGNAL==-1,线程2所在节点的waitStatus==0。加锁是从当前节点往前找,如果前置节点已经被取消,那么继续往前找,找到一个没有被取消的节点为止。解锁是从当前节点往后找,如果后置节点已经被取消,那么继续从后往前找,找到一个没有被取消的节点为止。出队是有条件的:必须抛出异常。只有在打断模式下才会抛出异常进入finally调用cancelAcquire方法出队。获取锁或者阻塞过程中,线程宕掉(系统异常或手动kill线程) 。则会进入到acquireQueued的finally代码里,并判断failed是否为true,若为true则执行cancelAcquire方法放弃获取锁。我们一般都说这个方法是用来中断线程的,那么这个中断应该怎么理解呢? 就是说把当前正在执行的线程中断掉,不让它继续往下执行吗?其实,不然。 此处,说的中断仅仅是给线程设置一个中断的标识(设置为true),线程还是会继续往下执行的。而线程怎么停止,则需要由我们自己去处理。 一会儿会用代码来说明这个。下面的示例代码说明当1个线程在park状态下被interrupt()方法打断或者被stop,会从之前阻塞的代码处唤醒并继续往下执行代码,而不是我们想象的直接跳出代码。但是有1个问题,为什么跳不出来循环呢?原来当调用interrupt方法时,会把中断状态设置为true,然后park方法会去判断中断状态,如果为true,就直接返回,然后往下继续执行,并不会抛出异常。注意,这里并不会清除中断标志。此时我们想到使用Thread.interrupted();方法重置打断标记为false发现上面的代码还是跳不出循环,而是被park阻塞。这个时候我们尝试使用抛出异常。抛出异常成功终止循环并执行了finally。其实上面的示例2就是不可打断模式的原理,示例2是可打断模式的原理。以上就是“java开发非公平锁不可打断免费云主机域名的源码怎么写”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注百云主机行业资讯频道。

相关推荐: Android怎么自定义View绘制贝塞尔曲线

本文小编为大家详细介绍“Android怎么自定义View绘制贝塞尔曲线”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android怎么自定义View绘制贝塞尔曲线”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在平面内任选 3 个不…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 05/12 09:54
下一篇 05/12 09:54

相关推荐