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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多线程,你觉得你安全了?(线程安全问题)

發(fā)布時間:2025/3/20 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程,你觉得你安全了?(线程安全问题) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

多線程de小事情

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

  • 文章目錄

    • 多線程de小事情
    • 預(yù)備知識:
    • 線程的狀態(tài)
      • 1.新生狀態(tài);
      • 2.就緒狀態(tài);
      • 3.運(yùn)行狀態(tài);
      • 4.阻塞狀態(tài);
        • 有四種原因?qū)е伦枞麪顟B(tài);
      • 5.死亡狀態(tài);
        • 導(dǎo)致死亡狀態(tài)有兩個原因;
    • 多線程在訪問共享資源時的確有優(yōu)點(diǎn),速度快;但是會出現(xiàn)安全性問題,數(shù)據(jù)錯亂;
      • 案例:設(shè)計一個火車售票模擬程序;假如只剩五張票,三個窗口同時售票,每個窗口都有100人在排隊;
    • つづく…


    預(yù)備知識:

    在探索多線程安全問題之前,我們需要了解一些相關(guān)知識;

    線程的狀態(tài)

    1.新生狀態(tài);

    用new關(guān)鍵字創(chuàng)建一個線程后,這個線程就是出于新生狀態(tài);

    2.就緒狀態(tài);

    線程的Start()方法被調(diào)用后,等待分配CPU時就是處于就緒狀態(tài)(也稱之為有資源無資格);

    3.運(yùn)行狀態(tài);

    線程的run()方法被執(zhí)行,被CPU選中;(有資源,有資格)

    4.阻塞狀態(tài);

    暫停某個線程的執(zhí)行,等待某個條件的發(fā)生;

    有四種原因?qū)е伦枞麪顟B(tài);

    1.執(zhí)行sleep()方法,使當(dāng)前線程休眠,處于阻塞狀態(tài);當(dāng)指定時間到達(dá)后進(jìn)入就緒狀態(tài);

    代碼如下:

    package com.bjsxt.threadMethod;public class MyThreadSleep implements Runnable{@Overridepublic void run() {try {System.out.println("my線程睡著了");Thread.sleep(1000);System.out.println("my線程醒了");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

    測試類代碼:

    package com.bjsxt.threadMethod;public class TestSleep {public static void main(String[] args) throws InterruptedException {MyThreadSleep my = new MyThreadSleep();Thread t = new Thread(my);t.start();System.out.println("主線程睡著");Thread.sleep(2000);System.out.println("主線程醒了");} }

    運(yùn)行效果:

    2.執(zhí)行wait()方法,使當(dāng)前線程進(jìn)入阻塞狀態(tài),當(dāng)調(diào)用notify()方法喚醒這個線程后,進(jìn)入就緒狀態(tài);

    暫時不做演示:在后續(xù)生產(chǎn)者、消費(fèi)者模式中進(jìn)行演示;

    3.Join()線程聯(lián)合:當(dāng)某個線程需要等待另一個線程執(zhí)行結(jié)束后,才能執(zhí)行是使用join()方法;

    代碼如下:

    public class MyThreadJoin1 implements Runnable{@Overridepublic void run() {for(int i=0;i<10;i++) {System.out.println(Thread.currentThread().getName()+"----"+i);}} }

    測試類代碼:

    public class TestJoin1 {public static void main(String[] args) throws InterruptedException {MyThreadJoin my = new MyThreadJoin();Thread t = new Thread(my);t.start();for(int i=0;i<10;i++) {if(i==2) {t.join();}System.out.println("----------"+Thread.currentThread().getName()+"---"+i);}}}

    運(yùn)行效果:

    4.線程運(yùn)行時,某個操作進(jìn)入阻塞狀態(tài),比如io流(read(),write()方法本身就是阻塞的 方法)只有當(dāng)阻塞原因消失后,線程才會進(jìn)入就緒狀態(tài);

    5.死亡狀態(tài);

    死亡狀態(tài)是線程的最后一個狀態(tài);

    導(dǎo)致死亡狀態(tài)有兩個原因;

    1.線程正常執(zhí)行結(jié)束;

    2.強(qiáng)制終止線程;
    當(dāng)線程處于死亡狀態(tài)后,不能再回到其他狀態(tài);

    多線程在訪問共享資源時的確有優(yōu)點(diǎn),速度快;但是會出現(xiàn)安全性問題,數(shù)據(jù)錯亂;

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

    車票類代碼:

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

    測試類代碼

    public class TestTicket {public static void main(String[] args) {Ticket t = new Ticket();Thread thread1 = new Thread(t,"A窗口");Thread thread2 = new Thread(t,"B窗口");Thread thread3 = new Thread(t,"B窗口");thread1.start();thread2.start();thread3.start();}}

    效果圖:
    如圖所示由于多線程的安全問題導(dǎo)致數(shù)據(jù)錯亂的問題;


    つづく…

    感謝您的觀看;后續(xù)仍然會不斷更新多線程,最終會以生產(chǎn)者消費(fèi)者模式的小項目結(jié)束;
    敬請期待;

    總結(jié)

    以上是生活随笔為你收集整理的多线程,你觉得你安全了?(线程安全问题)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。