java 線程安全list_JAVA并發編程實戰-線程安全性

線程安全性:

對象的狀態是指存儲在狀態變量(例如實例和靜態域)中的數據。

對象的狀態可能包括其他依賴對象的域。

例如:某個HashMap的狀態不僅存儲在HashMap對象本身,還存儲在許多Map.Entry對象中。

“共享”意味變量可以由多個線程同時訪問,而“可變”則意味變量的值在其生命周期內可以發生變化。

一個對象的是否需要是線程安全的,取決于它是否被多個線程訪問。要使得線程是安全的,就需要采用同步機制來協同對對象可變專業狀態的訪問。

Java 中的主要同步機制是關鍵字synchronized,它提供了一種獨占的加鎖方式,還有volatile類型的變量,顯式鎖、原子變量。

當多個線程訪問某個類時,不管運行時環境采用何種調度方式或者這些線程將如何交替執行,并且在主調代碼中不需要任何額外的同步或者協同,這個類都能表現出正確的行為,那么這個類就是線程安全的

無狀態的對象一定是線程安全的

49cf22da103324e6c1c44f2f92369f4b.png

內置鎖

Java提供了一種內置的鎖機制來支持鎖機制:同步代碼塊(一個作為鎖的對象引用+一個作為由這個鎖保護的代碼塊)。以synchronized修飾的方法就只一種橫跨整個方法體的同步代碼塊,其中該同步代碼塊的鎖就是方法調用所在的對象。

每個java對象都可以用做一個實現同步的鎖:內置鎖。線程在進入同步代碼塊之前會自動獲得鎖,并且在退出同步代碼塊的時候釋放鎖,不論正常退出還是拋出異常退出,獲得內置鎖的唯一路徑就是進入由這個鎖保護的同步代碼塊或者方法。

java的內置鎖相當于一個互斥鎖,這意味著最多只有一個線程能夠持有這種鎖,當線程A嘗試獲取一個由線程B持有的鎖時,線程A必須等待或者阻塞,直到B釋放這個鎖,如果B不釋放,那么A永遠等下去。

由于每次只能有一個線程執行內置鎖保護的代碼塊,因此,由這個鎖保護的同步代碼塊會以原子方式執行,多個線程在執行該代碼塊時也不會相互干擾。

重入

當某個線程請求一個由其他線程持有的鎖時,發出請求線程的就會阻塞,然而,由于內置鎖是可重入的,因此如果某個線程試圖獲得一個已經由它自己持有的鎖,那么這個請求就會成功。“重入”意味著獲取鎖的操作的粒度是“線程”,而不是“調用”。重入的一種是實現方法是,為每個鎖關聯一個獲取計數值和一個所有者線程,當計數值為0時,這個鎖就被認為是沒有被任何線程持有,當線程請求一個未被持有的鎖時,JVM將記下鎖的持有者,并且將獲取計數值置為1.如果同一個線程再次獲取這個鎖,計數值將遞增,而當線程退出同步代碼塊時,計數器會相應的遞減,當為0時候,這個鎖將被釋放

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

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

相關文章

日文轉換為羅馬音_手把手教你掌握韓語40音!入門必備哦

其實學習韓語還是蠻簡單的,平時看韓劇也能學會幾句比較常用的話~那么接下來我們進入正題,首先你可以根據自己的韓語學習經驗和全網搜集,整理出以下能夠快速學習韓語40音的方法,希望能幫助到更多面對韓語40音迷茫無措的…

php asp 發起post請求,PHP用curl函數POST請求到ASP頁面提示無效請求

如題,一提交即返回以下信息:錯誤您所請求的網址(URL)無法獲取——————————————————————————–當嘗試進行以下請求時:POST /card/pay_card.aspx HTTP/1.0Host: pay.m3guo.comX-Real-IP: 120.31.66.99X-Forwarded-For:…

win7一直顯示正在啟動_win7系統中提高啟動速度并且禁用某些軟件啟動的操作小技巧...

我們在啟動系統時,會出現啟動速度過慢,甚至達到假死機狀態,就是鼠標一直在轉圈圈的等待狀態。出現這個問題,一般是我們電腦中自啟動的軟件過多造成的,解決這個問題我們只要進入系統配置工具中,對系統進行相…

站怎么點都是一樣_抖音怎么做?這幾樣一樣都不能少,你都做到了嗎?

有人說去年是內容爆發年,也有人說今年是內容元年,其實不管哪年都好,反正電商平臺是越來越傾向于內容化運營,包括618都對入場商家的內容化運營有要求,特別是短視頻內容。下面就給大家分享一下如何去做好一個抖音賬號。分…

棧 php 驗證格式,表單驗證 - 《Biny - 高性能輕量級PHP框架》 - 書棧網 · BookStack...

表單驗證框架提供了一套完整的表單驗證解決方案,適用于絕大多數場景。表單驗證支持所有類型的驗證以及自定義方法簡單示例:namespaceapp\form;usebiny\lib\Form;/*** property \app\service\testService $testService* 自定義一個表單驗證類型類 繼承For…

只能獲取fixed語句初始值_因用了Insert into select語句,美女同事被開除了!

點擊上方 web項目開發,選擇 設為星標優質文章,及時送達--Insert into select請慎用。這天xxx接到一個需求,需要將表A的數據遷移到表B中去做一個備份。本想通過程序先查詢查出來然后批量插入。但xxx覺得這樣有點慢,需要耗費大量的網…

python獲取excel數據進行判斷輸出結果到excel,如何使用python xlrd/xlwt從一個excel工作簿提取數據并輸出到另一個excel工作簿?...

我正在為xlutils、xlrd和xlwt創建一個名為excel functions的類,最終我可能會創建一個庫。如果你有興趣幫我做一個刪除工作表的功能。您可能希望轉向openpyxl和/或pyexcel,因為它們更容易實現,并且有相應的功能。如果要從一個excel工作簿提取數…

php中sql格式化字符串,sqli注入-sprintf格式化字符串帶來的注入隱患

PHP中 sprintf()格式化輸出詳解sprintf()函數把格式化的字符串寫入變量中。arg1、arg2、參數將被插入到主字符串中的百分號(%)符號處。該函數是逐步執行的。在第一個%符號處,插入arg1,在第二個%符號處,插入arg2,以此類推。注釋:如…

mybatis依賴_這大概就是公司一直用Mybatis的原因!真的太強了

01 什么是MyBatis、Spring?MyBatis是什么?它是一個SQL Mapping框架,它是一個持久化技術框架。再說得簡單一點,它只不過是一個操作數據庫的框架。Spring是什么?Spring就是一個大容器,不管是IoC還是AOP&#…

php excelreader 中文,如何解決php excel reader導出excel中文亂碼?

解決php excel reader導出excel中文亂碼的方法:1、如果不使用dump函數,可以通過修改【_defaultEncoding】變量解決問題;2、如果使用dump函數導出excel,需要修改htmlentities函數解決。解決php excel reader導出excel中文亂碼的方法…

python畫同心圓程序_Python Turtle:使用circle()方法繪制同心圓

I am not at this point interested in an efficient way of producing concentric circles: I want to see what I have to do to get this way to work 為了解決OP的問題,對其原始代碼進行更改以使其正常工作是很簡單的:turtle_pos(trl, [trl.xcor() …

繞過寶塔禁止的php函數,寶塔disable functions函數全被禁命令執行+加域服務器如何無限制執行命令...

本地搭建實驗環境時遇到了不少小問題實驗環境2008 R2寶塔搭建的IIS discuz3.2X手動上傳shell冰蝎連接(ps:有表哥使用冰蝎的時候提示文件存在但是無法獲取密鑰,解決辦法,使用最新版本的冰蝎即可,具體詳情看更新日志)連接上shell發現無法執行命…

anaconda和python區別_初學 Python 者自學 Anaconda 的正確姿勢是什么?

事實上Anaconda 和 Jupyter notebook已成為數據分析的標準環境。 簡單來說,Anaconda是包管理器和環境管理器,Jupyter notebook 可以將數據分析的代碼、圖像和文檔全部組合到一個web文檔中。 接下來我詳細介紹下Anaconda,并在最后給出Jupyter …

oracle rman備份整庫,RMAN備份恢復整個庫

RMAN備份恢復整個庫1 查看歷史備份集$ rman target /RMAN> list backup;說明與資料檔案庫中的任何備份都不匹配上述結果說明之前沒有備份過2 備份整個庫RMAN> backup database;啟動 backup 于 21-3月 -15使用通道 ORA_DISK_1通道 ORA_DISK_1: 正在啟動全部數據文件備份集…

oracle 24756,關于ORA-24756: transaction does not exist的問題

最近在檢查一個數據庫時,發現跟蹤日志有大量的錯誤( ORA-24756: transaction does not exist)1、主機系統環境IBM P740#oslevel -s6100-06-05-11152、數據庫版本11.2.0.3 RAC ASM兩節點3、在數據庫跟蹤日志中出現大量錯誤。(alert文件太大無法上傳,幾乎…

python 函數 全局變量_python3函數內全局變量使用global

原博文 2017-08-16 23:08 ?def p_num(): global num num 10 print (num) num 5 p_num() print(num) ... 相關推薦 2019-12-11 15:55 ? 如果需要在函數內部改變函數外部的變量,就可以通過在函數內部聲明變量為global變量。這樣當程序運行至global變量便會替換外部…

java 切面_Java筆試面試精心整理得到89道Spring 核心知識【收藏向】

點擊上方"藍字",關注了解更多Spring Framework 簡稱 Spring,是 Java 開發中最常用的框架,地位僅次于 Java API,就連近幾年比較流行的微服務框架 SpringBoot,也是基于 Spring 實現的,SpringBoot 的…

安裝oracle 10g閃退,Windows 7安裝Oracle 10g常見錯誤及解決方法

Windows 7安裝Oracle 10g常見錯誤及解決方法在安裝之前&#xff0c;我們要先下載相應的版本。點擊&#xff1a;Oracle 10g支持Win7版錯誤A&#xff1a;正在檢查操作系統要求...要求的結果: 5.0,5.1,5.2,6.0 之一實際結果: 6.1檢查完成。此次檢查的總體結果為: 失敗 <<<…

python爬取百度文庫_利用Python語言輕松爬取數據

利用 Python 語言輕松爬取數據 對于小白來說&#xff0c;爬蟲可能是一件非常復雜、 技術門檻很高的事情。 比如有人認為學爬蟲必須精通 Python &#xff0c;然后哼哧哼哧系統學習 Python 的每個知識點&#xff0c;很久之后發現仍然爬不了數據&#xff1b;有的人則認為先要掌握 …

切比雪夫不等式例題講解_排序不等式,切比雪夫不等式及伯努利不等式

我們比較熟悉的不等式可能就是下面的這個不等式鏈以及柯西不等式了&#xff1a;對于不等式鏈的證明我們可以看下面這張圖&#xff0c;非常直觀形象&#xff1a;不太懂得也可以看這個視頻講解&#xff1a;知乎視頻?www.zhihu.com對于柯西不等式的證明及講解&#xff0c;我們之前…