Java線程知識點一

線程安全產生的最終緣由

多個線程訪問同一個變量的時候會產生java

線性安全定義

一個對象被多個線程訪問時是否安全. 多個線性安全的方法組合起來並不安全。安全

鎖的概念

可重入鎖:同一個線程能夠屢次得到這個鎖 公平鎖:獲取鎖的時候按照請求的順序去得到。 非公平鎖:獲取鎖的時候不是按照請求的順序得到。jvm

synchronized

非公平鎖,經過監視一個對象能夠鎖住代碼塊,或者直接加在方法前面。線程

靜態方法:鎖住當前Class對象。鎖的範圍靜態方法的範圍。。 非靜態方法:鎖住當前的這個對象。鎖的範圍只在當前對象。對象

ReentrantLock

把鎖以對象的方式封裝。 非公平鎖: new ReentrantLock(),先檢查隊列是否空,若是不是直接獲取,不然加到鏈表中 公平鎖:new ReentrantLock(true),直接先去獲取一下鎖,若是獲取不到則進入到一個鏈表中 ReentrantLock extends AbstractQueueSynchronizer(記錄當前鎖進入幾回,status) extends AbstractOwnableSynchronizer(記錄當前得到鎖的對象)排序

ReentrantLock內部有FairLock和NonfairLock兩個鎖的實現隊列

volatile

可見性

java線程工做的時候從主存裏面讀取數據到工做內存,在工做內存完成操做以後再寫入到主存裏。volatile可使得線程每次從主存裏面讀取,一個操做以後就強制寫回到主存中。內存

禁止指令衝排序

Object a = new Object(); 在jvm裏面是分爲三步來作的:it

  1. 分配內存空間
  2. 建立對象
  3. 把內存地址值分配給引用 jvm會對沒有依賴關係的語句進行重排序,執行的順序多是123,也有多是132。這種指令重排序會引發線性安全的問題,先檢查後操做的。

線性安全的集合:

Map

Hashtable 每一個方法加上synchronized ConcurrentHashMap 經過分段的方式減小鎖的干預範圍 Collections.synchronizedMap() 把Map包了一層,每隔方法加了synchronized再調用Map本身的方法io

List

Vector Collections.synchronizedList() 把List包了一層,每一個方法加了synchronized再調用List本身的方法

BlackingQueue

LinkedBlockingQueue 鏈表 PrioriryBlockingQueue 有優先級的blockingqueue,先取出優先級高的對象 ArrayListBlackingQueue 內部利用ReentrantLock以及Condition實現。 Condition.signal Condition.await

put(); 阻塞 take(); 阻塞

add() 滿了拋出異常 offer() 滿了返回false

poll 刪除並返回第一個 peek 直接返回第一個

相關文章
相關標籤/搜索