多執行緒,你覺得你安全了?(執行緒安全問題)
多執行緒de小事情
導航不迷路:文章目錄
預備知識:
在探索多執行緒安全問題之前,我們需要了解一些相關知識;
執行緒的狀態
1.新生狀態;
用new關鍵字建立一個執行緒後,這個執行緒就是出於新生狀態;
2.就緒狀態;
執行緒的Start()方法被呼叫後,等待分配CPU時就是處於就緒狀態(也稱之為有資源無資格);
3.執行狀態;
執行緒的run()方法被執行,被CPU選中;(有資源,有資格)
4.阻塞狀態;
暫停某個執行緒的執行,等待某個條件的發生;
有四種原因導致阻塞狀態;
1.執行sleep()方法,使當前執行緒休眠,處於阻塞狀態;當指定時間到達後進入就緒狀態;
程式碼如下:
package com.bjsxt.threadMethod;
public class MyThreadSleep implements Runnable{
@Override
public void run() {
try {
System.out.println("my執行緒睡著了");
Thread.sleep(1000);
System.out.println("my執行緒醒了");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.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{
@Override
public 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;
@Override
public void run() {
for(int i=0;i<100;i++) {
if(ticket>0) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.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();
}
}
效果圖:
如圖所示由於多執行緒的安全問題導致資料錯亂的問題;
つづく…
感謝您的觀看;後續仍然會不斷更新多執行緒,最終會以生產者消費者模式的小專案結束;
敬請期待;
相關文章
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- 多執行緒系列之 執行緒安全執行緒
- iOS 多執行緒之執行緒安全iOS執行緒
- 03 執行緒安全問題執行緒
- SimpleDateFormat 執行緒安全問題ORM執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- iOS多執行緒安全-13種執行緒鎖?iOS執行緒
- Java 多執行緒基礎(四)執行緒安全Java執行緒
- ArrayList 的執行緒安全問題執行緒
- 深入JAVA執行緒安全問題Java執行緒
- 多執行緒併發安全問題詳解執行緒
- 5分鐘搞懂多執行緒安全問題執行緒
- 多執行緒的安全性問題(三)執行緒
- 多執行緒與高併發(二)執行緒安全執行緒
- 小度分享-【多執行緒工作及執行緒安全】執行緒
- 併發與多執行緒之執行緒安全篇執行緒
- iOS多執行緒全套:執行緒生命週期,多執行緒的四種解決方案,執行緒安全問題,GCD的使用,NSOperation的使用iOS執行緒GC
- 執行緒安全執行緒
- parallelStream中的執行緒安全問題Parallel執行緒
- 多執行緒的安全問題及解決方案執行緒
- day20_多執行緒入門丶執行緒安全執行緒
- Java執行緒(一):執行緒安全與不安全Java執行緒
- [短文速讀 -5] 多執行緒程式設計引子:程式、執行緒、執行緒安全執行緒程式設計
- 執行緒、多執行緒和執行緒池,看完這些你就能全部搞懂了執行緒
- 什麼是執行緒安全和執行緒不安全執行緒
- Java中解決多執行緒資料安全問題Java執行緒
- Java執行緒安全面試題,你真的瞭解嗎?Java執行緒面試題
- 模板方法中的執行緒安全問題執行緒
- lambda中stream執行緒安全的問題執行緒
- 從FMDB執行緒安全問題說起執行緒
- 單例模式執行緒安全reorder問題單例模式執行緒
- Java 執行緒安全問題的本質Java執行緒
- 執行緒安全(二)執行緒
- Java執行緒安全Java執行緒
- JavaSE_多執行緒入門 執行緒安全 死鎖 狀態 通訊 執行緒池Java執行緒
- 畫江湖之 PHP 多執行緒開發 【執行緒安全 互斥鎖】PHP執行緒
- 畫江湖之 PHP 多執行緒開發 [執行緒安全 互斥鎖]PHP執行緒