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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

多线程别怕,有锁就安全;(解决线程安全问题)

發布時間:2025/3/20 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程别怕,有锁就安全;(解决线程安全问题) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

多線程de小事情

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

  • 文章目錄

    • 多線程de小事情
    • 前言
    • 打油詩
    • 何為線程同步?
    • 如何實現線程同步?
      • 1.Synchronized方法;
      • 案例
      • 2.Synchronized塊;
      • 案例
    • つづく…


    前言

    多線程分享資源優點是速度快,但是會出現安全問題;那怎么辦解決呢?一首打油詩送給您;

    打油詩

    救線吟

    作者:遅咲きの向日葵

    多線程,享資源;
    安全問題,據錯亂;
    不要急,莫要亂;
    線程同步,把鎖看;

    何為線程同步?

    線程同步其實就是一種等待機制,多個需要同時訪問此對象的線程進入這個對象的等待池形成隊列,等待前面的線程使用完畢后,下一個線程再使用。

    如何實現線程同步?

    1.Synchronized方法;

    通過在方法聲明中加入 synchronized 關鍵字來聲明,語法如下:
    public synchronized void accessVal(int newVal);

    原理

    synchronized 方法控制對“對象的類成員變量”的訪問:每個對象對應一把鎖,每個synchronized 方法都必須獲得調用該方法的對象的鎖方能執行,否則所屬線程阻塞,方法一旦執行,就獨占該鎖,直到從該方法返回時才將鎖釋放,此后被阻塞的線程方能獲得該鎖,重新進入可執行狀態。

    缺點

    若將一個大的方法聲明為 synchronized 將會大大影響效率;

    案例

    案例:設計一個火車售票模擬程序;假如只剩五張票,三個窗口同時售票,每個窗口都有100人在排隊;

    車票類代碼

    public class Ticket4 implements Runnable{private int ticket = 5;@Overridepublic void run() {for(int i=0;i<100;i++) {this.saleTicket();}}private synchronized void saleTicket() {if(ticket>0) {try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(Thread.currentThread().getName()+"正在賣第"+ticket--+"張票");}}}

    測試類

    public class TestTicket4 {public static void main(String[] args) {Ticket4 ticket4 = new Ticket4();Thread t1 = new Thread(ticket4,"A窗口");Thread t2 = new Thread(ticket4,"B窗口");Thread t3 = new Thread(ticket4,"C窗口");t1.start();t2.start();t3.start();}}

    運行結果

    CPU太偏心了,就讓A出風頭!

    2.Synchronized塊;

    通過 synchronized 關鍵字來聲明 synchronized 塊,語法如下:
    synchronized(syncObject)
    {
    //允許訪問控制的代碼
    }

    優點

    對于synchronized方法的缺點,synchronized塊便可解決;
    Synchronized塊可以精確地控制到具體的“成員變量”,縮小同步范圍,提高效率;

    建議

    Synchronized(syncObject){}中的syncObject對象又名:同步監視器;
    同步監視器只能是對象,推薦使用共享資源的對象,可以是當前對象this,也可以是其他的共享對象;

    案例

    案例:設計一個火車售票模擬程序;假如只剩五張票,三個窗口同時售票,每個窗口都有100人在排隊;

    車票類代碼

    public class Ticket3 implements Runnable{private int ticket=5;@Overridepublic void run() {for(int i=0;i<100;i++) {synchronized(this) {if(ticket>0) {try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(Thread.currentThread().getName()+"正在賣"+ticket+"張票");}ticket--;}}} }

    測試類

    public class TestTicket3 {public static void main(String[] args) {Ticket3 ticket3 = new Ticket3();Thread t1 = new Thread(ticket3,"A窗口");Thread t2 = new Thread(ticket3,"B窗口");Thread t3 = new Thread(ticket3,"C窗口");t1.start();t2.start();t3.start();}}

    運行結果

    只能說A是CPU的菜!


    つづく…

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

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

    總結

    以上是生活随笔為你收集整理的多线程别怕,有锁就安全;(解决线程安全问题)的全部內容,希望文章能夠幫你解決所遇到的問題。

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