永发信息网

java 线程池原理怎样避免线程死锁

答案:1  悬赏:0  手机版
解决时间 2021-11-28 04:20
java 线程池原理怎样避免线程死锁
最佳答案
Java线程死锁需要如何解决,这个问题一直在我们不断的使用中需要只有不断的关键。不幸的是,使用上锁会带来其他问题。让我们来看一些常见问题以及相应的解决方法: Java线程死锁 Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待那些根本不可能被释放的锁,从而导致所有的工作都无法完成。假设有两个线程,分别代表两个饥饿的人,他们必须共享刀叉并轮流吃饭。他们都需要获得两个锁:共享刀和共享叉的锁。 假如线程 “A”获得了刀,而线程“B”获得了叉。线程“A”就会进入阻塞状态来等待获得叉,而线程“B”则阻塞来等待“A”所拥有的刀。这只是人为设计的例子,但尽管在运行时很难探测到,这类情况却时常发生。虽然要探测或推敲各种情况是非常困难的,但只要按照下面几条规则去设计系统,就能够避免Java线程死锁问题: 让所有的线程按照同样的顺序获得一组锁。这种方法消除了 X 和 Y 的拥有者分别等待对方的资源的问题。 将多个锁组成一组并放到同一个锁下。前面Java线程死锁的例子中,可以创建一个银器对象的锁。于是在获得刀或叉之前都必须获得这个银器的锁。 将那些不会阻塞的可获得资源用变量标志出来。当某个线程获得银器对象的锁时,就可以通过检查变量来判断是否整个银器集合中的对象锁都可获得。如果是,它就可以获得相关的锁,否则,就要释放掉银器这个锁并稍后再尝试。 最重要的是,在编写代码前认真仔细地设计整个系统。多线程是困难的,在开始编程之前详细设计系统能够帮助你避免难以发现Java线程死锁的问题。 Volatile 变量,volatile 关键字是 Java 语言为优化编译器设计的。以下面的代码为例: 一.class VolatileTest { 二.public void foo() { 三.boolean flag = false; 四.if(flag) { 5.//this could happen 陆.} 漆.} 吧.} 一个优化的编译器可能会判断出if部分的语句永远不会被执行,就根本不会编译这部分的代码。如果这个类被多线程访问, flag被前面某个线程设置之后,在它被if语句测试之前,可以被其他线程重新设置。用volatile关键字来声明变量,就可以告诉编译器在编译的时候,不需要通过预测变量值来优化这部分的代码。 无法访问的Java线程死锁有时候虽然获取对象锁没有问题,线程依然有可能进入阻塞状态。在 Java 编程中IO就是这类问题最好的例子。当线程因为对象内的IO调用而阻塞时,此对象应当仍能被其他线程访问。该对象通常有责任取消这个阻塞的IO操作。造成阻塞调用的线程常常会令同步任务失败。如果该对象的其他方法也是同步的,当线程被阻塞时,此对象也就相当于被冷冻住了。 其他的线程由于不能获得对象的Java线程死锁,就不能给此对象发消息(例如,取消 IO 操作)。必须确保不在同步代码中包含那些阻塞调用,或确认在一个用同步阻塞代码的对象中存在非同步方法。尽管这种方法需要花费一些注意力来保证结果代码安全运行,但它允许在拥有对象的线程发生阻塞后,该对象仍能够响应其他线程。 编辑推荐: 一. Java多线程优化之偏向锁原理分析 二. Java多线程实现异步调用的方法 三. 使用Java多线程机制实现下载的方法介
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
古代一两黄金等价多少两银子?
酒加什么更容易醉
别人叫我舅舅我应该叫他什么?
经常吃绿豆汤有什么坏处
您好,三千瓦电机变了二相电机需要多大电容?
中国为什么不在苏联解体之际收腹西伯利亚!?
读者文章阅读网的用户平台
张林东天道酬勤值多少
(96/x²-16)+(3x-1/4-x)=(2
安利深海鱼油的含量成分
香港岛和舟山岛哪个面积大
WinPcap的4.1.0.2001安装日志 完全不明白什么
打的 的汉语拼音是什么?
烧38度5能自己好吗
4.2×0.5简便计算
推荐资讯
买车时在晋城上户和沁水上户有什么区别
成都,商贷购房后,公积金可以取几次?已经取
微信里易方达基金易理财是什么,我买了100块
4.2乘1.9的简便计算
醋酸(CH3COOH)是一种重要的有机化工原料,
王吴军《老太太的纸条》阅读答案
糖类抗原242是22,724是24应该做哪些检查?
lookatthecatiisfat是什么意思????
在什么情况下选用稀油润滑?
住宅大厅门对前面人家瓦房顶角怎解?
小轿车烟筒坏了还可以测尾气吗
C5驾照是否可以上高速公路?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?