多线程,你觉得你安全了?(线程安全问题)
生活随笔
收集整理的這篇文章主要介紹了
多线程,你觉得你安全了?(线程安全问题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
多線程de小事情
導航不迷路:文章目錄
- 多線程de小事情
- 預備知識:
- 線程的狀態
- 1.新生狀態;
- 2.就緒狀態;
- 3.運行狀態;
- 4.阻塞狀態;
- 有四種原因導致阻塞狀態;
- 5.死亡狀態;
- 導致死亡狀態有兩個原因;
- 多線程在訪問共享資源時的確有優點,速度快;但是會出現安全性問題,數據錯亂;
- 案例:設計一個火車售票模擬程序;假如只剩五張票,三個窗口同時售票,每個窗口都有100人在排隊;
- つづく…
預備知識:
在探索多線程安全問題之前,我們需要了解一些相關知識;
線程的狀態
1.新生狀態;
用new關鍵字創建一個線程后,這個線程就是出于新生狀態;
2.就緒狀態;
線程的Start()方法被調用后,等待分配CPU時就是處于就緒狀態(也稱之為有資源無資格);
3.運行狀態;
線程的run()方法被執行,被CPU選中;(有資源,有資格)
4.阻塞狀態;
暫停某個線程的執行,等待某個條件的發生;
有四種原因導致阻塞狀態;
1.執行sleep()方法,使當前線程休眠,處于阻塞狀態;當指定時間到達后進入就緒狀態;
代碼如下:
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("主線程醒了");} }運行效果:
2.執行wait()方法,使當前線程進入阻塞狀態,當調用notify()方法喚醒這個線程后,進入就緒狀態;
暫時不做演示:在后續生產者、消費者模式中進行演示;
3.Join()線程聯合:當某個線程需要等待另一個線程執行結束后,才能執行是使用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);}}}運行效果:
4.線程運行時,某個操作進入阻塞狀態,比如io流(read(),write()方法本身就是阻塞的 方法)只有當阻塞原因消失后,線程才會進入就緒狀態;
5.死亡狀態;
死亡狀態是線程的最后一個狀態;
導致死亡狀態有兩個原因;
1.線程正常執行結束;
2.強制終止線程;
當線程處于死亡狀態后,不能再回到其他狀態;
多線程在訪問共享資源時的確有優點,速度快;但是會出現安全性問題,數據錯亂;
案例:設計一個火車售票模擬程序;假如只剩五張票,三個窗口同時售票,每個窗口都有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();}}效果圖:
如圖所示由于多線程的安全問題導致數據錯亂的問題;
つづく…
感謝您的觀看;后續仍然會不斷更新多線程,最終會以生產者消費者模式的小項目結束;
敬請期待;
總結
以上是生活随笔為你收集整理的多线程,你觉得你安全了?(线程安全问题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用获取线程基本信息的方法(新手专属)
- 下一篇: Exception in thread