多線程Thread(初階三:線程的狀態及線程安全)

目錄

一、線程的狀態

二、線程安全


一、線程的狀態

1.NEW Thread:對象創建好了,但是還沒有調用 start 方法在系統中創建線程。

2.TERMINATED:?Thread 對象仍然存在,但是系統內部的線程已經執行完畢了。

3.RUNNABLE: 就緒狀態,表示這個線程正在 cpu 上執行,或者準備就緒隨時可以去 pu 上執行。

4.TIMED WAITING: 指定時間的阻塞.就在到達一定時間之后自動解除阻塞使用 sleep 會進入這個狀態 使用帶有超時時間的join也會。

5.WAITING: 不帶時間的阻塞(死等),必須要滿足一定的條件,才會解除阻塞join 或者 wait 都會進入 WAITING。

6.BLOCKED: 由于鎖競爭,引起的阻塞.(后面線程安全的時候具體介紹)

這六種狀態在生命周期的大概位置,如圖:

用代碼形式測試 NEW 、RUNNABLE、TERMINATED 狀態

代碼:

public class ThreadDemo3 {private static int count = 0;public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {for (int i = 0; i < 5000; i++) {count++;}System.out.println("count: " + count);});//t線程開始前System.out.println("t線程開始前: " + t.getState());t.start();//t線程執行中System.out.println("t線程執行中: " + t.getState());//t線程結束后t.join();System.out.println("t線程結束后: " + t.getState());}
}

執行效果:

學習這些狀態,最大的作用就是調試多線程代碼bug的時候,給我們提供重要的參考依據當某個程序卡住了,也就是意味著一些關鍵的線程阻塞了,我們就可以觀察線程的狀態,分享出一些原因。

注意:一個線程只能start一次,也就是說只有是NEW狀態的線程才能start。

二、線程安全

線程安全:某個代碼,不管它是單個線程執行,還是多個線程執行,都不會產生bug,這個情況就成為“線程安全”。

線程不安全:某個代碼,它單個線程執行,不會產生bug,但是多個線程執行,就會產生bug,這個情況就成為 “線程不安全”,或者 “存在線程安全問題”。

舉個線程不安全例子,現在,我們想計算一個變量的自增次數,它循環了100000次,用兩個線程去計算,各自計算循環50000次的次數。

代碼:

public class ThreadDemo4 {private static int count = 0;public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {for (int i = 1; i < 50000; i++) {count++;}});Thread t2 = new Thread(() -> {for (int i = 50000; i <= 100000; i++) {count++;}});t1.start();t2.start();t1.join();t2.join();System.out.println("count: " + count);}
}

我們知道,從1到10_0000,肯定是自增了10_0000次,但是我們看看輸出結果如何?

答案卻不是10_0000,是50000多次,這是為何呢?原因就是多線程代碼,它們是并發執行的。

這個count++是由cpu的三個指令構成的:

(1)load 從內存中讀取數據到cpu的寄存器中。

(2)add 把寄存器中的值 + 1。

(3)save 把寄存器中的值寫回到內存中。

因為上面兩個線程是并發執行的,那么 t1 和 t2 線程的執行順序就是無序的,他們可能同時讀取數據,自增完再+1,下面用圖示他們的一些可能性。

暫時就畫這么多,因為線程并發的執行結果個數是無數的,并不是簡單的排列組合就能窮舉出來,因為并發的原因,可能 t1 線程它執行了兩次,才執行一次 t2 線程,也可能更多,或者 t2 執行的次數更多,t1 線程只執行一次。就又要排列組合了,這些情況都是有可能的。

這時,t1 和 t2自增的時候,就可能拿的是同一個值,這兩線程的其中一個自增后,沒放回內存中,另一個線程就又拿了,這肯定是不符合我們預期的。

所以我們從上面的可能情況找,符合我們預期的效果就只有這兩個了,如圖

那么這種情況也就是串行化執行,執行完 t1,再執行t2,或者兩個順序相反。

代碼:

public class ThreadDemo4 {private static int count = 0;public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {for (int i = 1; i < 50000; i++) {count++;}});Thread t2 = new Thread(() -> {try {t1.join();} catch (InterruptedException e) {throw new RuntimeException(e);}for (int i = 50000; i <= 100000; i++) {count++;}});t1.start();t2.start();t2.join();System.out.println("count: " + count);}
}

執行效果:

但這樣就沒必要使用多線程了,因為串行化,一個線程就能搞定了,使用多線程也沒太大意義。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/166899.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166899.shtml
英文地址,請注明出處:http://en.pswp.cn/news/166899.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

雪花算法原理(設計原理、優缺點、如何改造它、以及應用)

雪花算法原理&#xff08;設計原理、優缺點、如何改造它、以及應用&#xff09; 雪花算法源碼為什么雪花算法是 64 位&#xff1f;為什么時間戳是41位&#xff1f;占雪花算法的 43-47 bit 位為什么工作臺最大只支持設置 31 &#xff1f;工作臺設置成了 63 會導致什么后果&#…

JeecgBoot3.0 漏洞升級 — 快速文檔

近幾年來&#xff0c;黑客攻擊行為呈現出日益復雜和隱蔽的趨勢&#xff0c;對個人和組織的安全造成了嚴重威脅。黑客們不斷尋找新的漏洞和安全漏洞&#xff0c;利用各種手段進行網絡攻擊&#xff0c;包括惡意軟件、網絡釣魚、勒索軟件等。因此&#xff0c;我們每個人都需要關注…

Java 之 final 詳解

目錄 一. 前言 二. final 的基礎使用 2.1. 修飾類 2.2. 修飾方法 2.2.1. private 方法是隱式的 final 2.2.2. final 方法可以被重載 2.3. 修飾參數 2.4. 修飾變量 2.4.1. static final 2.4.2. blank final 2.4.3. 所有 final 修飾的字段都是編譯期常量嗎&#xff1f…

數據結構:二叉查找樹,平衡二叉樹AVLTree,紅黑樹RBTree,平衡多路查找數B-Tree,B+Tree

二叉查找樹 二叉樹具有以下性質&#xff1a;左子樹的鍵值小于根的鍵值&#xff0c;右子樹的鍵值大于根的鍵值。 對該二叉樹的節點進行查找發現深度為1的節點的查找次數為1&#xff0c;深度為2的查找次數為2&#xff0c;深度為n的節點的查找次數為n&#xff0c;因此其平均查找次…

2023年亞太數學建模C題數據分享+詳細思路

在報名截止的前一天&#xff0c;我嘗試進行了報名。到那時&#xff0c;已有11,000個隊伍注冊參賽。在我的了解中&#xff0c;在數模比賽中除了國賽美賽外&#xff0c;幾乎沒有其他競賽的參賽隊伍數量能與此相媲美。即便不考慮賽題的難度和認可度&#xff0c;亞太地區的這場競賽…

JavaScript實現動態背景顏色

JavaScript實現動態背景顏色 前言實現過程HTML實現過程CSS實現過程JS實現過程全部源碼 前言 本文主要講解JavaScript如何實現動態背景顏色&#xff0c;可以根據顏色選擇器選擇的顏色而實時更新到背景中&#xff0c;如下圖所示。 當我們在顏色選擇器中改變顏色時&#xff0c;會…

代碼掃描,漏洞檢測

1) SQL注入是一種數據庫攻擊手段。攻擊者通過向應用程序提交惡意代碼來改變原SQL語句的含義&#xff0c;進而執行任意SQL命令&#xff0c;達到入侵數據庫乃至操作系統的目的。在Mybatis Mapper Xml中&#xff0c;#變量名稱創建參數化查詢SQL語句,不會導致SQL注入。而$變量名稱…

SPSS信度分析

前言&#xff1a; 本專欄參考教材為《SPSS22.0從入門到精通》&#xff0c;由于軟件版本原因&#xff0c;部分內容有所改變&#xff0c;為適應軟件版本的變化&#xff0c;特此創作此專欄便于大家學習。本專欄使用軟件為&#xff1a;SPSS25.0 本專欄所有的數據文件請點擊此鏈接下…

內網滲透之Linux權限提升大法

文章目錄 內網滲透|Linux權限提升大法0x01 前言0x02 工具介紹1.traitor2.LinEnum3.linux-exploit-suggester.sh4.Linux Exploit Suggester 25.beroot 0X02提權手法1.環境變量提權2.利用suid提權3.定時任務提權3.1定時任務文件覆蓋提權3.2定時任務tar命令通配符注入提權 4.sudo提…

【matlab程序】matlab給風速添加圖例大小

【matlab程序】matlab給風速添加圖例大小 clear;clc;close all; % load 加載風速數據。 load(matlab.mat) % 加載顏色包信息 gray load(D:\matlab_work\函數名為colormore的顏色索引表制作\R_color_txt\R_color_single\gray89.txt); brown load(D:\matlab_work\函數名為color…

_STORAGE_WRITE_ERROR_ thinkphp報錯問題原因

整個報錯內容如下 Uncaught exception Think\Exception with message _STORAGE_WRITE_ERROR_:./Runtime/Cache/Home/1338db9dec777aab181d4e74d1bdf964.php in C:\inetpub\wwwroot\ThinkPHP\Common\functions.php:101 Stack trace: #0 C:\inetpub\wwwroot\ThinkPHP\Library\…

1. 應用編程概念

1. 應用編程概念 1 系統調用概念1 應用編程和裸機編程、驅動編程的區別 1 系統調用概念 系統調用其實是 Linux 內核提供給應用層的應用編程接口&#xff0c;是 Linux 應用層進入內核的入口。用戶通過系統調用來使用系統提供的各種服務&#xff0c;實現了與內核的交互。 1 應用…

JavaFx 設置窗口邊框圓角

UI界面要求窗口邊框有一定弧度&#xff0c;因為之前沒有做過&#xff0c;網上看了很多文章&#xff0c;都用到了css語句 "-fx-background-radius: ; 我在xml布局文件根節點使用無效&#xff0c;在Scene組件設置無效&#xff0c;gpt等ai問了一圈代碼也是無效&#xff0c;…

【JavaEE】認識多線程

作者主頁&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感謝你閱讀本文&#xff0c;歡迎一建三連哦。 本文錄入于《vaEE》專欄&#xff0c;本專欄是針對于大學生&#xff0c;編程小白精心打造的。筆者用重金(時間和精力)打造&am…

React + BraftEditor 實現富文本編輯

Braft Editor 是一個基于 React 和 Draft-js 開發的富文本編輯器&#xff0c;提供了豐富的基礎功能&#xff0c;如基本文本格式化、列表、鏈接、圖片上傳、視頻插入等&#xff0c;并且還支持擴展。 首先&#xff0c;確保你已經在項目中安裝了 Braft Editor 和它的依賴項&#x…

NPU、CPU、GPU算力及算力計算方式

NVIDIA在9月20日發布的NVIDIA DRIVE Thor 新一代集中式車載計算平臺&#xff0c;可在單個安全、可靠的系統上運行高級駕駛員輔助應用和車載信息娛樂應用。提供 2000 萬億次浮點運算性能&#xff08;2000 萬億次8位浮點運算&#xff09;。NVIDIA當代產品是Orin&#xff0c;算力是…

Java基礎(問題+答案)——第4期

其他的幾期見這個專欄 Java中的多態性&#xff08;Polymorphism&#xff09;&#xff1a; 多態性是指一個對象可以用來引用多個類型的特性。在Java中&#xff0c;多態性通過方法的重寫和接口實現來實現。 Java中的final關鍵字的用途&#xff1a; final可以用于變量、方法和類。…

堪比數據恢復大師軟件推薦,恢復數據很簡單!

“作為一個經常丟失數據的電腦用戶來說&#xff0c;我覺得我非常需要一些簡單有效的數據恢復方法。大家有什么比較靠譜的軟件推薦嗎&#xff1f;非常感謝&#xff01;” 在數字化時代&#xff0c;數據的存儲是比較重要的。很多用戶都會選擇將重要的文件保存在電腦上。如果數據丟…

第二證券:北證50指數一枝獨秀 短劇游戲概念股持續活躍

周三&#xff0c;滬深兩市三大指數顫動調整&#xff0c;北證50指數“鶴立雞群”&#xff0c;大漲超8%。到收盤&#xff0c;上證綜指報3043.61點&#xff0c;跌0.79%&#xff1b;深證成指報9855.66點&#xff0c;跌1.41%&#xff1b;創業板指報1950.01點&#xff0c;跌1.73%。滬…

ITSS項目概述及評估流程!

ITSS項目概述 ITSS (Information Technology Service Standards&#xff0c;信息技術服務標準&#xff0c;簡稱ITSS)是一套成體系和綜合配套的信息技術服務標準庫&#xff0c;全面規范了IT服務產品及其組成要素&#xff0c;用于指導實施標準化和可信賴的IT服務&#xff0c;是套…