java線程死鎖
/**
* 死鎖
* 多個線程各自占有一些共享資源,并且互相等待其他線程占有的資源釋放才能繼續(xù)而都進(jìn)入阻塞狀態(tài),停止執(zhí)行
* 同時擁有兩個以上對象的鎖時可能發(fā)生死鎖
*/
public class TestThread2 implements Runnable{
? ?public static class LockA{}
? ?public static class LockB{}
? ?//創(chuàng)建兩個類用于對象鎖
? ?LockA lockA;
? ?LockB lockB;
? ?boolean aFirst;
? ?public TestThread2(LockA lockA, LockB lockB, boolean aFirst) {
? ? ? ?this.lockA = lockA;
? ? ? ?this.lockB = lockB;
? ? ? ?this.aFirst = aFirst;
? ?}
? ?@Override
? ?public void run() {
? ? ? ?if (aFirst){
? ? ? ? ? ?ab();
? ? ? ?}else {
? ? ? ? ? ?ba();
? ? ? ?}
? ?}
? ?public void ab(){
? ? ? ?synchronized(lockA){
? ? ? ? ? ?System.out.println(Thread.currentThread().getName()+"正在使用lockA");
? ? ? ? ? ?try {
? ? ? ? ? ? ? ?Thread.sleep(1);
? ? ? ? ? ?} catch (InterruptedException e) {
? ? ? ? ? ? ? ?throw new RuntimeException(e);
? ? ? ? ? ?}
? ? ? ? ? ?System.out.println(Thread.currentThread().getName()+"排隊等待使用lockB");
? ? ? ? ? ?synchronized (lockB){
? ? ? ? ? ? ? ?//在同步代碼內(nèi)進(jìn)行其他鎖對象的同步
? ? ? ? ? ? ? ?System.out.println(Thread.currentThread().getName()+"正在使用lockB");
? ? ? ? ? ?}
? ? ? ?}
? ?}
? ?public void ba(){
? ? ? ?synchronized(lockB){
? ? ? ? ? ?System.out.println(Thread.currentThread().getName()+"正在使用lockB");
? ? ? ? ? ?try {
? ? ? ? ? ? ? ?Thread.sleep(1);
? ? ? ? ? ?} catch (InterruptedException e) {
? ? ? ? ? ? ? ?throw new RuntimeException(e);
? ? ? ? ? ?}
? ? ? ? ? ?System.out.println(Thread.currentThread().getName()+"排隊等待使用lockA");
? ? ? ? ? ?synchronized (lockA){
? ? ? ? ? ? ? ?//在同步代碼內(nèi)進(jìn)行其他鎖對象的同步
? ? ? ? ? ? ? ?System.out.println(Thread.currentThread().getName()+"正在使用lockA");
? ? ? ? ? ?}
? ? ? ?}
? ?}
? ?public static void main(String[] args) {
? ? ? ?LockA lockA = new LockA();
? ? ? ?LockB lockB = new LockB();
? ? ? ?Thread t1 = new Thread(new TestThread2(lockA,lockB,true));
? ? ? ?Thread t2 = new Thread(new TestThread2(lockA,lockB,false));
? ? ? ?t1.start();
? ? ? ?t2.start();
? ? ? ?/*結(jié)果為
? ? ? ?Thread-1正在使用lockB
? ? ? ?Thread-0正在使用lockA
? ? ? ?Thread-1排隊等待使用lockA
? ? ? ?Thread-0排隊等待使用lockB
? ? ? ?T-1等待T-0釋放lockA而阻塞,T-0等待T-1釋放lockB而阻塞形成死鎖
? ? ? ?java中沒有專用的解決辦法,因此編程時禁止使用synchronized相互嵌套
? ? ? ? */
? ?}
}