锁用不好,可能把自己锁住哦!(解决多线程的死锁问题)
生活随笔
收集整理的這篇文章主要介紹了
锁用不好,可能把自己锁住哦!(解决多线程的死锁问题)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
多線(xiàn)程de小事情
導(dǎo)航不迷路:文章目錄
- 多線(xiàn)程de小事情
- 前言
- 死鎖是なに啊?
- 代碼如下:
- 解決死鎖
- 代碼如下:
- つづく…
前言
加上鎖以后,確實(shí)可以解決多線(xiàn)程安全問(wèn)題;但是有時(shí)候鎖用不好,就會(huì)把自己鎖住,陷入互相等待,這就是所謂的死鎖;
死鎖是なに啊?
多個(gè)線(xiàn)程持有共享資源,并且等待其他線(xiàn)程占有的資源才能進(jìn)行,而導(dǎo)致兩個(gè)或多個(gè)線(xiàn)程互相等待對(duì)方釋放資源,都停止執(zhí)行的情形;
代碼如下:
public class DeadLock2 extends Thread{private Object car;//共享資源車(chē)private Object people;//共享資源人public boolean flag;//標(biāo)識(shí)持有對(duì)象鎖public DeadLock2(Object car, Object people) {super();this.car = car;this.people = people;}@Overridepublic void run() {if(flag) {synchronized (car) {System.out.println("有輛車(chē),但沒(méi)人開(kāi)");try {Thread.sleep(1000);} catch (Exception e) {// TODO: handle exception}synchronized (people) {System.out.println("有個(gè)人,但沒(méi)車(chē)開(kāi)");}}}else {synchronized (people) {System.out.println("有個(gè)人,但沒(méi)車(chē)開(kāi)");try {Thread.sleep(1000);} catch (Exception e) {// TODO: handle exception}synchronized (car) {System.out.println("有輛車(chē),但沒(méi)人開(kāi)");}}}}}測(cè)試類(lèi)
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();} }運(yùn)行效果
如圖所示:兩個(gè)線(xiàn)程都執(zhí)行了一半,便處于等待狀態(tài);
解決死鎖
導(dǎo)致死鎖的原因是:一個(gè)代碼塊持有多個(gè)同步鎖而造成的;
只要一個(gè)代碼塊,不要同時(shí)持有兩個(gè)對(duì)象的同步鎖就可以解決死鎖問(wèn)題;
代碼如下:
public class DeadLock2 extends Thread{private Object car;//共享資源車(chē)private Object people;//共享資源人public boolean flag;//標(biāo)識(shí)持有對(duì)象鎖public DeadLock2(Object car, Object people) {super();this.car = car;this.people = people;}@Overridepublic void run() {if(flag) {synchronized (car) {System.out.println("有輛車(chē),但沒(méi)人開(kāi)");try {Thread.sleep(1000);} catch (Exception e) {// TODO: handle exception}}synchronized (people) {System.out.println("有個(gè)人,但沒(méi)車(chē)開(kāi)");}}else {synchronized (people) {System.out.println("有個(gè)人,但沒(méi)車(chē)開(kāi)");try {Thread.sleep(1000);} catch (Exception e) {// TODO: handle exception}}synchronized (car) {System.out.println("有輛車(chē),但沒(méi)人開(kāi)");}}}}測(cè)試類(lèi)
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();}}運(yùn)行效果
如圖所示:程序正常;只要改動(dòng)一點(diǎn)點(diǎn)就可以輕松解決;
つづく…
感謝您的觀看;后續(xù)仍然會(huì)不斷更新多線(xiàn)程,最終會(huì)以生產(chǎn)者消費(fèi)者模式的小項(xiàng)目結(jié)束;
敬請(qǐng)期待;
總結(jié)
以上是生活随笔為你收集整理的锁用不好,可能把自己锁住哦!(解决多线程的死锁问题)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 新世界的开启
- 下一篇: 多线程终极模式:生产者-消费者模式