java线程死锁例子及解决方法
来源:互联网 发布:淘宝差评不显示怎么办 编辑:程序博客网 时间:2024/06/10 06:06
Java线程死锁是由于有些资源彼此交叉取用,就有可能造成死结.
如1线程中 取得A对象的锁定后又要取得B对象的锁定.但是同时2线程中取得B对象的锁定后又要取得A对象的锁定.这两个线程同时发生时就会造成,1线程拿到A对象锁定后等待B对象的锁定.2线程拿到B对象锁定后等待A对象锁定.这样就会进入没有停止的等待中.
线程死锁的一个简单例子:
package deadLockThread;public class Test {private int size=0; public synchronized void doSome(){size++; }public synchronized void doTest(Test test){try {Thread.sleep(1000);//睡眠1秒 效果更明显} catch (InterruptedException e) {e.printStackTrace();} test.doSome(); //另外一个对象调用synchronized 函数 需要取得该对象的对象锁定}}
package deadLockThread;public class DeadLock {public static void main(String[] args) {final Test t1=new Test();final Test t2=new Test();Thread th1=new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubt1.doTest(t2);}});Thread th2=new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubt2.doTest(t1);}});th1.start();th2.start();}}
如果真的没办法避免资源的交叉取用 我的解决方法是使用并行API在取得第一个对象锁定前先检测另外一个对象的对象锁定有没有被其他的线程拿走了.
synchronized 要求线程必须取得对象锁定,才可以执行所标识的区块范围.然而使用synchronized 有许多的限制,未取得锁定的线程会直接被打断.所以我这里使用并行API Lock 替代直接操作synchronized .
package deadLockThread;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Test {private int size = 0;private Lock lock = new ReentrantLock();public void doSome() {System.out.println(Thread.currentThread().getName() + "获取size");size++;}public void doTest(Test test) {while (true) {boolean myLock = this.lock.tryLock();// 尝试取得当前对象的Lock锁定boolean testLock = test.lock.tryLock();// 尝试取得被传入得对象的Lock锁定try {if (myLock && testLock) { //当两个对象的Lock 都获取到后再进行 操作test.doSome();break;}} finally {if (myLock) {this.lock.unlock();}if (testLock) {test.lock.unlock();}}}}}
package deadLockThread;public class DeadLock {public static void main(String[] args) {final Test t1 = new Test();final Test t2 = new Test();Thread th1 = new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubt1.doTest(t2);}});Thread th2 = new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubt2.doTest(t1);}});th1.start();th2.start();}}
文字部门参考Java学习笔记
0 0
- java线程死锁例子及解决方法
- java线程死锁例子及解决方法
- java线程死锁例子
- java-死锁现象及解决方法
- Java线程死锁及解决方案
- java 线程死锁的小例子
- java中的线程死锁的一个例子
- Java线程死锁的简单例子
- Java多线程____线程死锁例子
- java 死锁例子及相关讲解
- java 死锁例子及相关讲解
- 线程死锁例子
- 线程死锁例子
- Java并发编程:死锁及解决方法
- java线程死锁原因及避免
- 引起线程死锁的一种情况及解决方法
- sQL死锁及解决方法
- 数据库死锁及解决方法
- 一个字符串在另一个字符串中出现的次数
- 加载网页——iOS学习连载28
- CSS3 Media Queries Css媒体查询
- Android开发真机测试方法
- 谷歌返华,是“狼来了”还是狼来了?
- java线程死锁例子及解决方法
- C# Attribute(特性)之---数据契约 [DataContract]
- Data URL和图片
- [Switf]下标语法subscript简单举例
- MySQL常用操作语句
- Linux重新学习--shell script--函数
- Android 垂直与水平滚动条:Scrollview与HorizontalScrollView
- Windows上wget的安装版本
- 使标签居中的方法