線程間的共享和協作

線程間的共享和協作


內置鎖機制:Java支持多個線程同時訪問一個對象或者對象的成員變量,關鍵字synchronized可以修飾方法或者以同步塊的形式來進行使用,它主要確保多 個線程在同一個時刻,只能有一個線程處於方法或者同步塊中,它保證了線程對變量訪問的可見性和排他性,又稱爲內置鎖機制。


對象鎖是用於對象實例方法,或者一個對象實例上的。


類鎖是用於類的靜態方法或者一個類的class對象上的


注意:

類鎖其實鎖的是每個類的對應的class對象。


volatile,最輕量的同步機制,volatile保證了不同線程對這個變量進行操作時的可見性,即一個線程修改了某個變量的值,這新值對其他線程來說是立即 可見的,不加volatile時,子線程無法感知主線程修改了ready的值,從而不會退出循環,而加了volatile後,子線程可以感知主線程修改了ready的值,迅 速退出循環,volatile最適用的場景:一個線程寫,多個線程讀。


ThreadLocal和Synchonized都用於解決多線程併發訪問。


synchronized是利用鎖的機制,使變量或代碼塊在某一時該僅僅能被一個線程訪問。

ThreadLocal爲每個線程都提供了變量的副本,使得每個線程在某一時間訪問到的並非同一個對象,這樣就隔離了多個線程對數據的數據共享。


ThreadLocal的使用

ThreadLocal類接口很簡單,只有4個方法

void set(Object value)

設置當前線程的線程局部變量的值。


public Object get()

該方法返回當前線程所對應的線程局部變量。

public void remove()

將當前線程局部變量的值刪除,目的是爲了減少內存的佔用,該方法是JDK 5.0新增的方法。需要指出的是,當線程結束後,對應該線程的局部變量將自動被垃圾回收,所以顯式調用該方法清除線程的局部變量並不是必須的操作,但它可以加快內存回收的速度。

protected Object initialValue()

返回該線程局部變量的初始值,該方法是一個protected的方法,顯然是爲了讓子類覆蓋而設計的。這個方法是一個延遲調用方法,在線程第1次調用get()或set(Object)時才執行,並且僅執行1次。ThreadLocal中的缺省實現直接返回一個null。

public final static ThreadLocal<String> RESOURCE = new ThreadLocal<String>();RESOURCE代表一個能夠存放String類型的ThreadLocal對象。此時不論什麼一個線程能夠併發訪問這個變量,對它進行寫入、讀取操作,都是線程安全的。

瞭解更多知識,請關注公衆號:itjungle

後面有更精彩內容發佈。歡迎關注:itjungle

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章