锁用不好,可能把自己锁住哦!(解决多线程的死锁问题)
生活随笔
收集整理的這篇文章主要介紹了
锁用不好,可能把自己锁住哦!(解决多线程的死锁问题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
多線程de小事情
導航不迷路:文章目錄
- 多線程de小事情
- 前言
- 死鎖是なに啊?
- 代碼如下:
- 解決死鎖
- 代碼如下:
- つづく…
前言
加上鎖以后,確實可以解決多線程安全問題;但是有時候鎖用不好,就會把自己鎖住,陷入互相等待,這就是所謂的死鎖;
死鎖是なに啊?
多個線程持有共享資源,并且等待其他線程占有的資源才能進行,而導致兩個或多個線程互相等待對方釋放資源,都停止執行的情形;
代碼如下:
public class DeadLock2 extends Thread{private Object car;//共享資源車private Object people;//共享資源人public boolean flag;//標識持有對象鎖public DeadLock2(Object car, Object people) {super();this.car = car;this.people = people;}@Overridepublic void run() {if(flag) {synchronized (car) {System.out.println("有輛車,但沒人開");try {Thread.sleep(1000);} catch (Exception e) {// TODO: handle exception}synchronized (people) {System.out.println("有個人,但沒車開");}}}else {synchronized (people) {System.out.println("有個人,但沒車開");try {Thread.sleep(1000);} catch (Exception e) {// TODO: handle exception}synchronized (car) {System.out.println("有輛車,但沒人開");}}}}}測試類
public class DeadLock2Test {public static void main(String[] args) {Object car = new Object();Object people = new Object();DeadLock2 dl = new DeadLock2(car, people);DeadLock2 dl2 = new DeadLock2(car, people);dl.flag=true;dl2.flag = false;dl.start();dl2.start();} }運行效果
如圖所示:兩個線程都執行了一半,便處于等待狀態;
解決死鎖
導致死鎖的原因是:一個代碼塊持有多個同步鎖而造成的;
只要一個代碼塊,不要同時持有兩個對象的同步鎖就可以解決死鎖問題;
代碼如下:
public class DeadLock2 extends Thread{private Object car;//共享資源車private Object people;//共享資源人public boolean flag;//標識持有對象鎖public DeadLock2(Object car, Object people) {super();this.car = car;this.people = people;}@Overridepublic void run() {if(flag) {synchronized (car) {System.out.println("有輛車,但沒人開");try {Thread.sleep(1000);} catch (Exception e) {// TODO: handle exception}}synchronized (people) {System.out.println("有個人,但沒車開");}}else {synchronized (people) {System.out.println("有個人,但沒車開");try {Thread.sleep(1000);} catch (Exception e) {// TODO: handle exception}}synchronized (car) {System.out.println("有輛車,但沒人開");}}}}測試類
package com.bjsxt.thread;public class DeadLock2Test {public static void main(String[] args) {Object car = new Object();Object people = new Object();DeadLock2 dl = new DeadLock2(car, people);DeadLock2 dl2 = new DeadLock2(car, people);dl.flag=true;dl2.flag = false;dl.start();dl2.start();}}運行效果
如圖所示:程序正常;只要改動一點點就可以輕松解決;
つづく…
感謝您的觀看;后續仍然會不斷更新多線程,最終會以生產者消費者模式的小項目結束;
敬請期待;
總結
以上是生活随笔為你收集整理的锁用不好,可能把自己锁住哦!(解决多线程的死锁问题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新世界的开启
- 下一篇: 多线程终极模式:生产者-消费者模式