java 死锁

死锁由多线程带来的性能改善是以可靠性为代价的,主要是因为有可能产生线程死锁。死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不能正常运行。简单的说就是:线程死锁时,第一个线程等待第二个线程释放资源,而同时第二个线程又在等待第一个线程释放资源。

示例代码:

package main;

public class Main {
	// 死锁案例
	public static void main(String[] args) {
		Thread t1 = new Thread(new StudentA());
		Thread t2 = new Thread(new StudentB());
		t1.start();
		t2.start();
	}

	static Object N = new Object();// N锁
	static Object P = new Object();// P锁

	static class StudentA implements Runnable {

		@Override
		public void run() {
			synchronized (N) {
				System.out.println(Thread.currentThread().getName() + "获得N锁");
				try {
					Thread.sleep(1000);// 睡眠一秒 ,保证两个线程同步执行(并发),否则线程启动有差异影响测试结果
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName() + "想要获得P锁,才释放N锁");
				synchronized (P) {
					System.out.println(Thread.currentThread().getName() + "获得P锁");
				}

				System.out.println(Thread.currentThread().getName() + "释放P锁");
			}
			System.out.println(Thread.currentThread().getName() + "释放N锁");
		}

	}

	static class StudentB implements Runnable {

		@Override
		public void run() {
			synchronized (P) {
				System.out.println(Thread.currentThread().getName() + "获得P锁");
				try {
					Thread.sleep(1000);// 睡眠一秒 ,保证两个线程同步执行(并发)
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName() + "想要获得N锁,才释放P锁");
				synchronized (N) {
					System.out.println(Thread.currentThread().getName() + "获得N锁");
				}
				System.out.println(Thread.currentThread().getName() + "释放N锁");
			}
			System.out.println(Thread.currentThread().getName() + "释放P锁");
		}

	}
}


截图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值