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

标记不会被变量阻塞的可用资源. 当线程获取银器对象的锁时,它可以通过检查变量来检查整个银器集合中的对象锁是否可用. 如果是,则可以获取相关的锁,否则,有必要释放银器锁,然后再试一次.
最重要的是在编写代码之前仔细设计整个系统. 多线程很难. 在开始编程之前详细设计系统可以帮助您避免发现Java线程死锁的问题.
可变变量,volatile关键字是由Java语言设计的,用于优化编译器. 以下面的代码为例:
VolatileTest类{
public void foo(){

布尔标志=假;
if(标志){
//这可能发生
}
}

}
优化的编译器可以确定该语句的if部分将永远不会执行,并且根本不会编译该部分代码. 如果该类被多个线程访问,则在由前一个线程设置该标志之后,可以在其他其他线程将其重置之前,再通过if语句对其进行测试. 使用volatile关键字声明变量,可以告诉编译器,在编译时,不需要预测变量的值即可优化代码的这一部分.
无法访问的Java线程死锁有时,尽管获取对象锁没有问题,但是线程仍可能进入阻塞状态. IO是Java编程中此类问题的最佳示例. 当某个线程被对象中的IO调用阻塞时,该对象仍应可由其他线程访问. 该对象通常负责取消此阻塞的IO操作. 导致阻塞调用的线程通常会使同步任务失败. 如果该对象的其他方法也同步,则程被阻塞时,该对象等效于被冻结.
由于无法获取对象的Java线程的死锁,其他线程无法向该对象发送消息(例如,取消IO操作). 您必须确保不将那些阻塞调用包括在同步代码中,或确保使用同步阻塞代码的对象中存在异步方法. 尽管此方法需要注意以确保生成的代码安全运行,但它允许对象在拥有对象块的线程之后响应其他线程.
================================================ ======================

死锁是一种情况,其中多个线程同时被阻塞,并且其中一个或所有线程都在等待释放资源. 由于线程被无限期阻塞,因此程序无法正常终止.
死锁的根本原因是不恰当地使用了“ synchronized”关键字来管理对特定对象的线程访问. “ synchronized”关键字的作用是确保一次只允许一个线程执行特定的代码块,因此允许执行的线程必须首先具有对变量或对象的独占访问权限. 当一个线程访问一个对象时,该线程将锁定该对象,并且该锁定导致也希望访问同一对象的其他线程被阻塞,直到第一个线程释放它添加到该对象的锁为止.
因此,当使用“ synchronized”关键字时,两个线程很容易彼此等待以进行操作. 代码一是死锁的简单示例.
//代码一
Java代码
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-191140-1.html
好想去哎谁让我是个学生党呢凡凡