读书人

应用资源排序解决Java线程死锁解决的方

发布时间: 2012-11-09 10:18:48 作者: rapoo

使用资源排序解决Java线程死锁解决的方法

????? 经常看以前大学里面的教材中的一个解决线程死锁的例子,其技术叫做"资源排序",但代码只是一部分,我今天把它写全,这里的关键点是线程对各个对象加锁顺序一定得保持一致.

?

/** * 此类轻易的解决了死锁问题,其核心思想为 各线程按照顺序依次对各对象加锁, * 假设有三个线程需要竞争三个资源,线程加锁顺序是 lock1,lock2,lock3,这个应该称作为 "资源排序" *  * @author Chase * */public class DeadLockSolution {private static final Object lock1 = new Object();private static final Object lock2 = new Object();private static final Object lock3 = new Object();private Thread1 thread1 = new Thread1();private Thread2 thread2 = new Thread2();private Thread3 thread3 = new Thread3();class Thread1 extends Thread {public void run() {synchronized (lock1) {System.out.println("线程1已对 1资源 加锁");try {Thread.sleep(1000);} catch (InterruptedException e) {}synchronized (lock2) {System.out.println("线程1已对 2资源 加锁");try {Thread.sleep(1000);} catch (InterruptedException e) {}synchronized (lock3) {System.out.println("线程1已对 3资源 加锁");try {Thread.sleep(1000);} catch (InterruptedException e) {}}}}System.out.println("线程1运行完毕!");}}class Thread2 extends Thread {public void run() {synchronized (lock1) {System.out.println("线程2已对 1资源 加锁");try {Thread.sleep(1000);} catch (InterruptedException e) {}synchronized (lock2) {System.out.println("线程2已对 2资源 加锁");try {Thread.sleep(1000);} catch (InterruptedException e) {}synchronized (lock3) {System.out.println("线程2已对 3资源 加锁");try {Thread.sleep(1000);} catch (InterruptedException e) {}}}}System.out.println("线程2运行完毕!");}}class Thread3 extends Thread {public void run() {synchronized (lock1) {System.out.println("线程3已对 1资源 加锁");try {Thread.sleep(1000);} catch (InterruptedException e) {}synchronized (lock2) {System.out.println("线程3已对 2资源 加锁");try {Thread.sleep(1000);} catch (InterruptedException e) {}synchronized (lock3) {System.out.println("线程3已对 3资源 加锁");try {Thread.sleep(1000);} catch (InterruptedException e) {}}}}System.out.println("线程3运行完毕!");}}public DeadLockSolution() {thread1.start();thread2.start();thread3.start();}public static void main(String[] args) {new DeadLockSolution();}}

?

运行结果:

?

线程1已对 1资源 加锁
线程1已对 2资源 加锁
线程1已对 3资源 加锁
线程1运行完毕!
线程3已对 1资源 加锁
线程3已对 2资源 加锁
线程3已对 3资源 加锁
线程2已对 1资源 加锁
线程3运行完毕!
线程2已对 2资源 加锁
线程2已对 3资源 加锁
线程2运行完毕!?

?

不同的机器线程运行的先后可能不太一样,但是应该不会出现死锁的情况.

读书人网 >编程

热点推荐