javaSE 死锁,多线程同步嵌套

运行Java: java -Xms100M -Xmx200M HelloWorld;  运行java程序时,手动分配内存的最大值和最小值,可以优化垃圾回收。
故障诊断:死锁(安装ThreadDump,可以定位产生死锁的位置信息)

 

Demo.java:

package cn.xxx.demo;

public class Demo {
	public static void main(String[] args) {
		DeadLock dead = new DeadLock();
		Thread t0 = new Thread(dead);  // 创建线程
		Thread t1 = new Thread(dead);
		t0.start();  // 开启线程
		t1.start();
	}
}

DeadLock.java(线程类,实现Runnable接口,重写run方法):

package cn.xxx.demo;

public class DeadLock implements Runnable{  // 实现Runnable接口
	private int i = 0;
	public void run(){  // 重写run方法
		while(true){
			if(i%2==0){
				//先进入A同步,再进入B同步
				synchronized(LockA.locka){  // 同步
					System.out.println("我拿到了资源A,还需要资源B");
					synchronized(LockB.lockb){  // 同步嵌套
						System.out.println("我也拿到了资源B,可以开始执行任务了");
					}
				}
			}else{
				//先进入B同步,再进入A同步
				synchronized(LockB.lockb){  // 同步
					System.out.println("我拿到了资源B,还需要资源A");
					synchronized(LockA.locka){  // 同步嵌套
						System.out.println("我也拿到了资源A,可以开始执行任务了");
					}
				}
			}
			i++;
		}
	}
}

LockA.java(对象锁A):

package cn.xxx.demo;

public class LockA {
	private LockA(){}
	
	public  static final LockA locka = new LockA();
}

LockB.java(对象锁B):

package cn.xxx.demo;

public class LockB {
	private LockB(){}
	
	public static final LockB lockb = new LockB();
}

 

 

 


版权声明:本文为houyanhua1原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。