Java并发死锁
来源:互联网 发布:数字网络广播系统文章 编辑:程序博客网 时间:2024/03/29 00:29
死锁描述了两个或多个线程等待彼此而被永久阻塞的情况。 当多个线程需要相同的锁定但以不同的顺序获取时,会发生死锁。 Java多线程程序可能会遇到死锁状况,因为synchronized
关键字会导致执行线程在等待与指定对象相关联的锁定或监视时出现阻止情况。 看看下面一个例子。
示例
public class TestThread {public static Object Lock1 = new Object();public static Object Lock2 = new Object();public static void main(String args[]) {ThreadDemo1 T1 = new ThreadDemo1();ThreadDemo2 T2 = new ThreadDemo2();T1.start();T2.start();}private static class ThreadDemo1 extends Thread {public void run() {synchronized (Lock1) {System.out.println("Thread 1: Holding lock 1...");try { Thread.sleep(10); }catch (InterruptedException e) {}System.out.println("Thread 1: Waiting for lock 2...");synchronized (Lock2) {System.out.println("Thread 1: Holding lock 1 & 2...");}}}}private static class ThreadDemo2 extends Thread {public void run() {synchronized (Lock2) {System.out.println("Thread 2: Holding lock 2...");try { Thread.sleep(10); }catch (InterruptedException e) {}System.out.println("Thread 2: Waiting for lock 1...");synchronized (Lock1) {System.out.println("Thread 2: Holding lock 1 & 2...");}}}}}
当您编译并执行上述程序时,会出现死锁情况,以下是程序生成的输出 -
Thread 1: Holding lock 1...Thread 2: Holding lock 2...
Thread 1: Waiting for lock 2...Thread 2: Waiting for lock 1...
上述程序将永久挂起,因为两个线程都不能继续进行,等待彼此释放锁定,所以您可以按CTRL + C
退出程序。
死锁解决方案示例
下面我们修改锁的顺序并运行相同的程序,看看这两个线程是否仍然相互等待 -
实例
public class TestThread {public static Object Lock1 = new Object();public static Object Lock2 = new Object();public static void main(String args[]) {ThreadDemo1 T1 = new ThreadDemo1();ThreadDemo2 T2 = new ThreadDemo2();T1.start();T2.start();}private static class ThreadDemo1 extends Thread {public void run() {synchronized (Lock1) {System.out.println("Thread 1: Holding lock 1...");try {Thread.sleep(10);}catch (InterruptedException e) {}System.out.println("Thread 1: Waiting for lock 2...");synchronized (Lock2) {System.out.println("Thread 1: Holding lock 1 & 2...");}}}}private static class ThreadDemo2 extends Thread {public void run() {synchronized (Lock1) {System.out.println("Thread 2: Holding lock 1...");try {Thread.sleep(10);}catch (InterruptedException e) {}System.out.println("Thread 2: Waiting for lock 2...");synchronized (Lock2) {System.out.println("Thread 2: Holding lock 1 & 2...");}}}}}
所以只是改变锁的顺序防止程序进入死锁情况并完成以下结果 -
Thread 1: Holding lock 1...Thread 1: Waiting for lock 2...Thread 1: Holding lock 1 & 2...Thread 2: Waiting for lock 2...Thread 2: Holding lock 1...Thread 2: Holding lock 1 & 2...
上面的例子只是为了更容易理解这个解决死锁的概念,然而,这是一个复杂的概念,应该深入了解它,然后才能再开发应用程序来处理死锁情况。
阅读全文
0 0
- Java并发死锁
- Java并发之死锁
- java并发之死锁
- Java线程:并发协作-死锁
- Java线程:并发协作-死锁
- Java线程:并发协作-死锁
- Java线程:并发协作-死锁
- Java线程:并发协作-死锁
- Java并发编程实战--死锁
- Java线程:并发协作-死锁
- Java线程:并发协作-死锁
- java多线程:并发协作-死锁
- Java线程:并发协作-死锁
- Java 并发编程之死锁
- Java线程:并发协作-死锁
- Java线程:并发协作-死锁
- Java线程:并发协作-死锁
- Java并发系列-13、死锁
- PullToRefresh的下拉刷新
- HTTP Status 500
- hive操作-建表
- 移动端虚拟键盘与fixed定位失效问题!
- 35 个 Java 代码性能优化总结
- Java并发死锁
- 函数
- ios-CADisplayLink
- hdu 6058/2017多校联合第三场Kanade's sum(链表!)
- Cocos3.x跟Cocos2.x的区别
- Error : Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory
- 关于云测试
- laravel5.4使用Laravel Sms和阿里云短信服务实现短信验证码功能
- ASP.NET Web Pages – Chart 帮助器