日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

锁用不好,可能把自己锁住哦!(解决多线程的死锁问题)

發布時間:2025/3/20 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 锁用不好,可能把自己锁住哦!(解决多线程的死锁问题) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

多線程de小事情

導航不迷路:
  • 程序、進程以及線程的愛恨情仇
  • 最簡單實現多線程的方法(Thread)
  • 簡單易懂的多線程(通過實現Runnable接口實現多線程)
  • 常用獲取線程基本信息的方法(新手專屬)
  • 多線程,你覺得你安全了?(線程安全問題)
  • 多線程別怕,有鎖就安全;(解決線程安全問題)

  • 文章目錄

    • 多線程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();}}

    運行效果

    如圖所示:程序正常;只要改動一點點就可以輕松解決;


    つづく…

    感謝您的觀看;后續仍然會不斷更新多線程,最終會以生產者消費者模式的小項目結束;
    敬請期待;

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的锁用不好,可能把自己锁住哦!(解决多线程的死锁问题)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。