006 線程安全

文章目錄

  • 臨界資源
  • 線程安全
    • 基本概念
      • *何謂競態條件*
      • *何謂線程安全*
    • 對象的安全
      • 局部基本類型變量
      • 局部的對象引用
      • 對象成員(成員變量)
    • 不可變性

臨界資源

臨界資源是一次僅允許一個進程使用的共享資源。各進程采取互斥的方式,實現共享的資源稱作臨界資源。屬于臨界資源的硬件有,打印機,磁帶機等;軟件有消息隊列,變量,數組,緩沖區等。諸進程間采取互斥方式,實現對這種資源的共享。

線程安全

基本概念

何謂競態條件

當兩個線程競爭同一資源時,如果對資源的訪問順序敏感,就稱存在競態條件。
導致競態條件發生的代碼區稱作臨界區。
在臨界區中使用適當的同步就可以避免競態條件,如使用synchronized或者加鎖機制。

何謂線程安全

允許被多個線程同時執行的代碼稱作線程安全的代碼。線程安全的代碼不包含競態條件。

對象的安全

局部基本類型變量

局部變量存儲在線程自己的棧中。也就是說,局部變量永遠也不會被多個線程共享。所以,基礎類型的
局部變量是線程安全的。下面是基礎類型的局部變量的一個例子:


public class ThreadTest {public static void main(String[]args){MyThread share = new MyThread();for (int i=0;i<50;i++){new Thread(share,"線程"+i).start();}}
}
class MyThread implements Runnable{public void run() {int a =0;++a;System.out.println(Thread.currentThread().getName()+":"+a);}
}

無論多少個線程對run()方法中的基本類型a執行++a操作,只是更新當前線程棧的值,不會影響其他線程,也就是不共享數據;

局部的對象引用

對象的局部引用和基礎類型的局部變量不太一樣,盡管引用本身沒有被共享,但引用所指的對象并沒有存儲在線程的棧內。所有的對象都存在共享堆中。
如果在某個方法中創建的對象不會逃逸出(即該對象不會被其它方法獲得,也不會被非局部變量引用到)該方法,那么它就是線程安全的。
實際上,哪怕將這個對象作為參數傳給其它方法,只要別的線程獲取不到這個對象,那它仍是線程安全的。


public void method1(){LocalObject localObject = new LocalObject();localObject.callMethod();method2(localObject);
}
public void method2(LocalObject localObject){localObject.setValue("value");
}

對象成員(成員變量)

對象成員存儲在堆上。如果兩個線程同時更新同一個對象的同一個成員,那這個代碼就不是線程安全的。


public class ThreadTest {public static void main(String[]args){NotThreadSafe sharedInstance = new NotThreadSafe();new Thread(new MyRunnable(sharedInstance)).start();new Thread(new MyRunnable(sharedInstance)).start();}
}
class MyRunnable implements Runnable{NotThreadSafe instance = null;public MyRunnable(NotThreadSafe instance){this.instance = instance;}public void run(){this.instance.add(" "+Thread.currentThread().getName());System.out.println(this.instance.builder.toString());}
}
class NotThreadSafe{StringBuilder builder = new StringBuilder();public void add(String text){this.builder.append(text);}
}

不可變性

通過創建不可變的共享對象來保證對象在線程間共享時不會被修改,從而實現線程安全。如下示例:


public class ImmutableValue{private int value = 0;public ImmutableValue(int value){this.value = value;}public int getValue(){return this.value;}
}

請注意ImmutableValue類的成員變量 value 是通過構造函數賦值的,并且在類中沒有set方法。這意味著一旦ImmutableValue實例被創建, value 變量就不能再被修改,這就是不可變性。但你可以通過getValue()方法讀取這個變量的值。

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

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

相關文章

如何使用GPT進行科研:詳細指令指南

如何使用GPT進行科研&#xff1a;詳細指令指南 隨著GPT模型的流行&#xff0c;越來越多的科研人員開始利用這項技術來輔助科學研究&#xff0c;特別是在文本處理任務如論文翻譯、文本潤色和降低抄襲率方面。本文將提供詳細的指令&#xff0c;幫助科研人員有效地使用GPT進行科研…

計算機相關專業入門,高考假期預習指南

一&#xff1a;學習資源推薦 跟著b站的“黑馬程序員”學c&#xff0c;黑馬程序員匠心之作|C教程從0到1入門編程,學習編程不再難_嗶哩嗶哩_bilibili&#xff0c;把這個編程語言基礎打好&#xff0c;然后看“藍橋杯算法”&#xff0c;到了大一直接就能打藍橋杯比賽了 看完上面的 …

TRILL簡介

介紹TRILL的定義及目的。 定義 TRILL(Transparent Interconnection of Lots of Links)是一種把三層鏈路狀態路由技術應用于二層網絡的協議。TRILL通過擴展IS-IS路由協議實現二層路由&#xff0c;可以很好地滿足數據中心大二層組網需求&#xff0c;為數據中心業務提供解決方案…

用數組手搓一個小頂堆

堆默認從數組下標為1開始存儲。 const int N201000; int heap[N]; int len; 插入操作&#xff1a; 將元素插入到堆的末尾位置向上調整。 void up(int k){while(k>1&&heap[k/2]>heap[k]){swap(heap[k],heap[k/2]);k/2;} } //len為當前存在元素長度 void Inser…

水利水庫大壩結構安全自動化監測主要測哪些內容?

在大壩安全自動化監測系統建設中&#xff0c;應根據壩型、壩體結構和地質條件等因素選定監測項目&#xff1b;主要監測對象包括壩體、壩基及有關的各種主要水工建筑物、大壩附近的不穩定岸坡和大壩周邊的氣象環境。深圳安銳科技建議參考下列表格適當調整。 &#xff08;一&am…

計算機網絡(2

計算機網絡續 一. 網絡編程 網絡編程, 指網絡上的主機, 通過不同的進程, 以編程的方式實現網絡通信(或網絡數據傳輸). 即便是同一個主機, 只要不同進程, 基于網絡來傳輸數據, 也屬于網絡編程. 二. 網絡編程套接字(socket) socket: 操作系統提供的網絡編程的 API 稱作 “soc…

(0)2024年基于財務的數據科學項目Python編程基礎(Jupyter Notebooks)

目錄 前言學習目標&#xff1a;學習內容&#xff1a;大綱 前言 隨著數據科學的迅猛發展&#xff0c;其在財務領域的應用也日益廣泛。財務數據的分析和預測對于企業的決策過程至關重要。 本專欄旨在通過Jupyter Notebooks這一強大的交互式計算工具&#xff0c;介紹基于財務的數…

【車載開發系列】常見單片機調試接口的區別

【車載開發系列】常見單片機調試接口的區別 【車載開發系列】常見單片機調試接口的區別 【車載開發系列】常見單片機調試接口的區別一. JTAG協議二. SWD接口三. RDI接口四. 仿真器1&#xff09;J-Link仿真器2&#xff09;ULink仿真器3&#xff09;ST-LINK仿真器 五. SWD / JTAG…

Day05-組織架構-角色管理

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 1.組織架構-編輯部門-彈出層獲取數據2.組織架構-編輯部門-編輯表單校驗3.組織架構-編輯部門-確認取消4.組織架構-刪除部門5.角色管理-搭建頁面結構6.角色管理-獲取數…

MySQL中的DDL語句

第一題 輸入密碼登錄mysql&#xff0c;創建數據庫zoo&#xff0c;轉換到zoo數據庫&#xff0c; mysql> create database zoo character set gbk; mysql> use zoo查看創建數據庫zoo信息 mysql> show create database zoo;刪除數據庫zoo mysql> drop database zo…

【后端面試題】【中間件】【NoSQL】MongoDB查詢優化2(優化排序、mongos優化)

優化排序 在MongoDB里面&#xff0c;如果能夠利用索引來排序的話&#xff0c;直接按照索引順序加載數據就可以了。如果不能利用索引來排序的話&#xff0c;就必須在加載了數據之后&#xff0c;再次進行排序&#xff0c;也就是進行內存排序。 可想而知&#xff0c;如果內存排序…

【居家養老實訓室】:看中醫保健在養老中的應用

本文以居家養老實訓室為視角&#xff0c;深入探討了中醫保健在養老中的應用。通過對中醫保健理念、常用方法以及在居家養老中的具體實踐進行分析&#xff0c;闡述了其在改善老年人健康狀況、提高生活質量方面的重要作用。同時&#xff0c;也指出了目前應用中存在的問題&#xf…

Apache Kylin模型構建全解析:深入理解大數據的多維分析

引言 Apache Kylin是一個開源的分布式分析引擎&#xff0c;旨在為大數據提供快速的多維分析能力。它通過預計算技術&#xff0c;將數據轉化為立方體模型&#xff08;Cube&#xff09;&#xff0c;從而實現對Hadoop大數據集的秒級查詢響應。本文將詳細介紹Kylin中模型構建的全過…

Windchill的Debug配置

在windchillshell中運行以下命令 xconfmanager -s "wt.manager.cmd.MethodServer.debug.args- agentlib:jdwptransportdt_socket,servery,suspendn,address0.0.0.0:{19}" -p - t codebase/wt.properties xconfmanager -s "wt.manager.cmd.MethodServer.param.19…

2024暑假集訓第三次考試

3004. Sleepy Cow Sorting 思路分析 這道題是一道思維題。 這個就要結合之前學習過的算法&#xff0c;看這個題目的排序方式&#xff0c;我們就理所當然的想到了插入排序&#xff0c;也是這道題的正解。只需要看看前面有幾個數是無序的就是需要排的次數。轉換一下&#xff0c;也…

【第19章】MyBatis-Plus自定義ID生成器

文章目錄 前言一、如何自定義二、Spring Boot 集成1. 方式一&#xff1a;聲明為Bean供Spring掃描注入2. 方式二&#xff1a;使用配置類3. 方式三&#xff1a;通過MybatisPlusPropertiesCustomizer自定義 三、Spring 集成1. 方式一&#xff1a;XML配置2. 方式二&#xff1a;注解…

【CUDA】 矩陣乘法 matMatMul

矩陣乘法 matMatMul 矩陣乘法是基本線性代數子程序&#xff08;BLAS&#xff09;的重要組成部分&#xff0c;而且線性代數中許多其他操作以此為基礎。 圖1是兩個矩陣的乘法。 基礎方法&#xff0c;正方形tile和長方形tile 基礎方法 執行矩陣乘法的基礎方法是使用單個線程執…

Linux上web服務器搭建(Apache、Nginx)

第五章 web服務器 第一節 DNS&#xff1a;對域名進行解析&#xff0c;查詢對應的地址 1.1 web服務器簡介 www是world wide web的縮寫&#xff0c;也就是全球信息廣播的意思 1.2.網址及HTTP簡介 web服務器提供的這些數據大部分都是文件&#xff0c;那么我們需要在服務器端…

傳統視覺Transformer的替代者:交叉注意力Transformer(CAT)

傳統視覺Transformer的替代者:交叉注意力Transformer(CAT) 在深度學習的世界里,Transformer架構以其在自然語言處理(NLP)領域的卓越表現而聞名。然而,當它進入計算機視覺(CV)領域時,卻面臨著計算成本高昂和推理速度慢的雙重挑戰。現在,一項革命性的創新——交叉注意…

Qualcomm QCS6490 開發板運行高通AI Hub圖像分類程序

相關代碼可以在如下鏈接下載&#xff1a; ai-hub-models/apps/android/ImageClassification at main quic/ai-hub-models GitHub 所用硬件有&#xff1a; 1. UBUNTU20.04 2. 高通QCS6490 開發板 對下載下來的代碼進行編譯 1. ubuntu環境配置 1. python環境配置 如果你…