多執行緒,你覺得你安全了?(執行緒安全問題)
多執行緒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執行緒
- iOS多執行緒之執行緒安全iOS執行緒
- SimpleDateFormat 執行緒安全問題ORM執行緒
- java執行緒安全問題Java執行緒
- 03 執行緒安全問題執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- 多執行緒非同步安全,安全鎖的問題執行緒非同步
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- 多執行緒-執行緒安全問題的產生原因分析以及同步程式碼塊的方式解決執行緒安全問題執行緒
- 多執行緒安全(一)執行緒
- Java 多執行緒基礎(四)執行緒安全Java執行緒
- iOS多執行緒安全-13種執行緒鎖?iOS執行緒
- ArrayList 的執行緒安全問題執行緒
- 深入JAVA執行緒安全問題Java執行緒
- 5分鐘搞懂多執行緒安全問題執行緒
- 多執行緒併發安全問題詳解執行緒
- 多執行緒的安全性問題(三)執行緒
- 執行緒3--執行緒安全執行緒
- 小度分享-【多執行緒工作及執行緒安全】執行緒
- 多執行緒與高併發(二)執行緒安全執行緒
- 併發與多執行緒之執行緒安全篇執行緒
- 執行緒安全和執行緒不安全理解執行緒
- 執行緒安全執行緒
- java多執行緒執行問題Java執行緒
- parallelStream中的執行緒安全問題Parallel執行緒
- 所謂的執行緒安全問題執行緒
- 多執行緒的安全問題及解決方案執行緒
- Java執行緒(一):執行緒安全與不安全Java執行緒
- day20_多執行緒入門丶執行緒安全執行緒
- 多執行緒-以前的執行緒安全的類回顧執行緒
- 多執行緒問題執行緒
- iOS多執行緒全套:執行緒生命週期,多執行緒的四種解決方案,執行緒安全問題,GCD的使用,NSOperation的使用iOS執行緒GC
- [短文速讀 -5] 多執行緒程式設計引子:程式、執行緒、執行緒安全執行緒程式設計
- 執行緒、多執行緒和執行緒池,看完這些你就能全部搞懂了執行緒
- 什麼是執行緒安全和執行緒不安全執行緒
- Java執行緒安全面試題,你真的瞭解嗎?Java執行緒面試題