【面试】请写一个java死锁的例子

参考文章:点击打开链接

 

问题:

请写一个java死锁的程序,当时只是说了死锁的一种情况,但是没有写出来。

造成死锁的情况之一:

线程1首先获得锁a,然后再同步块中竞争锁b,线程2获得锁b,然后在同步块中竞争锁a。

此时,锁a被线程1拥有,想要获得锁b,锁b被线程2拥有,想要获得锁a,无限循环。

代码:

 

public class MainTest {
	private Object locka = new Object();
	private Object lockb = new Object();
	public static void main(String[] args) {
		new MainTest().deadLock();
		
	}
	
	public void deadLock(){
		Thread thread1 = new Thread(new Runnable() {
			public void run() {
				synchronized (locka) {
					try {
						//进到这个同步代码块中,就表示当前线程获得了locka
						System.out.println(Thread.currentThread().getName()+" 获得锁a!");
						Thread.sleep(500);
						System.out.println(Thread.currentThread().getName()+" 休眠500毫秒之后");
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()+" 现在竞争锁b...");
					synchronized (lockb) {
						System.out.println(Thread.currentThread().getName()+"获得锁b!");
					}
					
				}
			}
		},"thread1");
		
		Thread thread2 = new Thread(new Runnable() {
			
			public void run() {
				String thread2Name = Thread.currentThread().getName();
				synchronized (lockb) {
					
					try {
						System.out.println(thread2Name+" 获得锁b!");
						Thread.sleep(500);
						System.out.println(thread2Name+"休眠500毫秒之后");
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
					System.out.println(thread2Name + " 现在竞争锁a...");
					synchronized (locka) {
					System.out.println(thread2Name+" 获得锁a!");
					}
				}
			}
		},"thread2");
		
		thread1.start();
		thread2.start();
	}
	
}

 

 

 

运行结果:

【面试】请写一个java死锁的例子_第1张图片

这就是造成的死锁现象。

 

 

【面试】请写一个java死锁的例子_第2张图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(JAVA笔试面试)