Java深入探索線程安全和線程通信的特性_第1頁
Java深入探索線程安全和線程通信的特性_第2頁
Java深入探索線程安全和線程通信的特性_第3頁
Java深入探索線程安全和線程通信的特性_第4頁
Java深入探索線程安全和線程通信的特性_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第Java深入探索線程安全和線程通信的特性目錄一、線程安全(重點)1、線程安全概念2、產生線程不安全的情況3、線程不安全的原因4、如何解決線程不安全問題二、synchronized關鍵字1、使用2、特性三、volatile關鍵字1、保證可見性2、禁止指令重排序3、不保證原子性四、wait和notify(線程間的通信)1、wait()方法2、notify()和notifyAll()方法3、wait和sleep的對比五、線程和進程的比較1、線程的優(yōu)點2、線程和進程的區(qū)別

一、線程安全(重點)

1、線程安全概念

在多線程的情況下,需要考慮多個線程并行并發(fā)執(zhí)行:此時多個線程之間的代碼是隨機執(zhí)行的。如果多線程環(huán)境下代碼的運行結果是符合我們的預期的,即在單線程情況下應該的結果,則這個程序是線程安全的。

2、產生線程不安全的情況

多個線程共享變量的操作:

都是讀操作時,使用值進行判斷,打印等操作(不存在線程安全問題)存在線程進行了寫操作(存在線程安全問題)

3、線程不安全的原因

(1)原子性:多行指令是最小的執(zhí)行單位(不可拆分),就具有原子性。如果不滿足原子性,則存在線程安全問題。

一條java語句不一定是原子的:

如n++、n--,是有三步組成:從內存讀取到cpu寄存器、修改數據、再寫回到cpu;Objecto=newObject(),也涉及到三個步驟:申請內存、初始化對象、賦值。

以上列舉的雖然只是一條java語句,但是其不具有原子性。

(2)可見性:一個線程對共享變量的修改,能夠及時的被其他線程看見。多個線程并發(fā)并行執(zhí)行,使用各自的工作內存,互相之間不可見(不具有可見性)。

Java內存模型(JMM):

目的是屏蔽掉各種硬件和操作系統(tǒng)的內存訪問差異,以實現Java程序在各種平臺下都能達到一致的并發(fā)效果。

線程之間的共享變量存在主內存;每一個線程都有自己的工作內存;當程序要讀取一個共享變量時,會先將變量從主內存拷貝到工作內存,再從工作內存讀取數據;當程序要修改一個共享變量時,會先修改工作內存中的副本,再同步到主內存。

(3)代碼順序性/有序性:

代碼重排序:

比如,以下代碼:

1、去前臺取U盤,

2、回教室寫一會作業(yè),

3、去前臺取快遞

在單線程的情況下,JVM、cpu會對其進行優(yōu)化,132,這樣會提高效率,這樣就叫做代碼重排序。

代碼重排序的前提是:保證邏輯不發(fā)生改變。

4、如何解決線程不安全問題

設計多線程代碼原則:滿足線程安全的前提下,盡可能地提高效率

(1)對共享變量的寫操作,可以加鎖來保證線程安全:

Java中加鎖的兩種方式:

synchronized關鍵字:申請對給定的Java對象,對象頭加鎖;Lock:是一個鎖的接口,它的實現類提供了鎖這樣的對象,可以調用方法來加鎖/釋放鎖。

對共享變量的寫操作,不依賴任何共享變量,也可以使用volatile關鍵字來保證線程安全。

(2)對共享變量的讀操作,使用volatile關鍵字就可以保證線程安全

volatile關鍵字:修飾變量,變量的讀操作,本身就保證了原子性,volatile的作用是保證可見性和有序性,這樣就可以保證線程安全。

二、synchronized關鍵字

synchronized本質上是修飾指定對象的對象頭去。使用角度來看,synchronized必須搭配一個具體的對象來使用。

1、使用

(1)修飾普通方法:鎖TestDemo對象

//方法一

publicclassTestDemo{

publicsynchronizedvoidmethond(){

//方法二

publicclassTestDemo{

publicvoidmethond(){

synchronized(this){

}

(2)修飾靜態(tài)方法:鎖TestDemo對象

//方法一

publicclassTestDemo{

publicsynchronizedstaticvoidmethod(){

//方法二

publicclassTestDemo{

publicstaticvoidmethod(){

synchronized(TestDemo.class){

}

2、特性

(1)互斥

synchronized會起到同步互斥的作用,某個線程執(zhí)行到某個對象的synchronized中時,如果其他線程也執(zhí)行到同一個對象synchronized時會阻塞等待。

進入synchronized修飾的代碼塊,相當于加鎖;退出synchronized代碼塊,相當于釋放鎖。

互斥可以滿足原子性,

(2)刷新內存

synchronized結束釋放鎖,會把工作內存中的數據刷新到主存中;其他線程申請鎖時,獲取的始終是最新的數據。(滿足可見性)。

(3)有序性

某個線程執(zhí)行一段同步代碼,不管如何重排序,過程中不可能有其他線程執(zhí)行的指令,這樣多個線程執(zhí)行同步代碼,就滿足一定的順序。

(4)可重入

同一個線程,可以多次申請同一個對象鎖(可重入)

三、volatile關鍵字

修飾某個變量(實例變量,靜態(tài)變量)

1、保證可見性

代碼在寫入volatilt修飾的變量時:

改變線程工作內存中volatile變量副本的值將改變后的副本的值從工作內存中刷新到主存中

代碼在讀取volatile修飾的變量時:

從主存中讀取volatile變量的最新值到工作內存中從工作內存中讀取副本值

2、禁止指令重排序

建立內存屏障,保證代碼有序性。

3、不保證原子性

synchronized和volatile有著本質區(qū)別。synchronized可以保證原子性,volatile保證的是內存的可見性。

只能在共享變量的讀操作以及常量賦值操作時使用(這些操作本身就具有原子性)

四、wait和notify(線程間的通信)

線程通信:線程間通信,就是一個線程以通知的方式,喚醒某些等待的線程(或者讓當前線程等待),這樣就可以讓線程通過通信的方式具有一定的順序性。

1、wait()方法

wait做的事情:

使當前執(zhí)行代碼的線程進入等待狀態(tài)(把線程放到等待隊列中)釋放當前的鎖滿足一定條件時,重新嘗試獲取這個鎖

wait結束等待的條件:

其他線程調用該對象的notify方法wait等待時間超時(wait提供了一個帶一個參數的方法,可以指定等待時間)其他線程調用該等待線程的interrupted方法,導致wait拋出InterruptedException異常

wait要搭配synchronized來使用。脫離synchronized使用wait會直接拋異常。

如下:

Objectobject=newObject();

synchronized(object){

object.wait();

//這種情況下線程會一直等待下去,這個時候需要使用notify來喚醒

2、notify()和notifyAll()方法

notify方法只是喚醒某一個等待的線程,使用notifyAll方法可以一次性喚醒所有的等待線程。

notify()也是在同步方法中調用,用來通知其他等待的線程,對其發(fā)出通知notify,并使它們重新獲取該對象的對象鎖;如果有多個線程在等待,則有線程調度器隨機挑選出一個處于等待狀態(tài)的線程;notify()方法執(zhí)行后,當前線程不會立馬釋放該對象鎖,要等到當前線程將程序執(zhí)行完,退出同步代碼塊后才會釋放對象鎖。

【注】

雖然notifyAll()同時喚醒所有處于等待狀態(tài)的線程,但是這些線程需要競爭鎖。所以并不是同時執(zhí)行,仍然是有先后順序的執(zhí)行。

3、wait和sleep的對比

一個是用于線程之間的通信,一個是讓線程阻塞一段時間。

wait需要搭配synchrionzed使用,sleep不用wait是Object的方法,sleep是Thread的靜態(tài)方法

五、線程和進程的比較

1、線程的優(yōu)點

創(chuàng)建線程的代價比創(chuàng)建進程小得多與進程切換相比,線程切換需要操作系統(tǒng)做的事少得多線程占用的資源比進程少能充分利用多個處理器,提高效率在等待I/O操作結束的同時,程序可執(zhí)行其他的計算任務I/O密集型操作,為

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論