java线程池 锁_如何避免Java线程池原理中的线程死锁

fd9da15a31ef4d98a75802b181731a73.jpg

全部展开

5f69cc916c153c382ed6bcea6b4d8481.png

如何解决Java线程死锁的问题,这个问题已经在我们不断使用中,只有关键没有被7a686964616fe4b893e5b19e31333363366165打破. 不幸的是,使用锁会导致其他问题. 让我们看一些常见的问题和相应的解决方案: Java线程死锁Java线程死锁是一个经典的多线程问题,因为不同的线程正在等待根本无法释放的锁,从而导致所有工作无法完成. 假设有两条线代表两个饥饿的人,他们必须共享刀叉并轮流吃饭. 他们俩都需要获得两个锁: 共享刀和共享叉锁. 假设线程“ A”得到刀,线程“ B”得到叉. 线程“ A”将进入阻塞状态以等待叉,而线程“ B”将阻塞以等待“ A”拥有的刀. 这只是人为设计的一个例子,但是尽管在运行时很难检测到,但是这种情况经常发生. 尽管很难检测或检查各种情况,但是只要按照以下规则设计系统,就可以避免Java线程死锁问题: 让所有线程以相同的顺序获取一组锁. 这种方法消除了X和Y所有者分别等待对方资源的问题. 对多个锁进行分组并将它们置于同一锁下. 在前面的Java线程死锁示例中,您可以为银器对象创建锁. 因此,必须在获得刀或叉之前获得银锁.

7d693e84e49a2963c08e73213a0e2d05.png

标记不会被变量阻塞的可用资源. 当线程获取银器对象的锁时,它可以通过检查变量来检查整个银器集合中的对象锁是否可用. 如果是,则可以获取相关的锁,否则,有必要释放银器锁并稍后再试. 最重要的是在编写代码之前仔细设计整个系统. 多线程很难. 在开始编程之前详细设计系统可以帮助您避免发现Java线程死锁的问题. 易失变量,易失关键字由Java语言设计,以优化编译器. 以下面的代码为例: 1.类VolatileTest {2. public void foo(){3. 布尔标志=假; 4. if(flag){5.///这可能发生在Lu. } Lac. }优化的编译器可以确定if部分中的语句将永远不会执行,并且根本不会编译这部分代码. 如果该类被多个线程访问java多线程避免死锁,则在由前一个线程设置该标志之后,可以通过其他线程将其重置,然后再通过if语句对其进行测试. 使用volatile关键字声明变量java多线程避免死锁,可以告诉编译器,在编译时,无需预测变量的值即可优化代码的这一部分. 难以访问的Java线程死锁有时,尽管获取对象锁没有问题,但线程仍可能进入阻塞状态.

ba94f975fa044392bca95281e281efce.png

IO是Java编程中此类问题的最佳示例. 当某个线程被对象中的IO调用阻塞时,该对象仍应可由其他线程访问. 该对象通常负责取消此阻塞的IO操作. 导致阻塞调用的线程通常会使同步任务失败. 如果对象的其他方法也同步,则程被阻塞时,该对象等效于被冻结. 由于无法获取对象的Java线程的死锁,其他线程无法向该对象发送消息(例如,取消IO操作). 您必须确保不将那些阻塞调用包括在同步代码中,或确保使用同步阻塞代码的对象中存在异步方法. 尽管此方法需要注意以确保生成的代码安全运行,但它允许对象在拥有对象块的线程之后响应其他线程. 编辑推荐: 1.分析Java多线程优化的偏向锁定原理2.异步调用的Java多线程方法3.使用Java多线程机制的下载方法

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-193810-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值