多個線程訪問同一個變量的時候會產生java
一個對象被多個線程訪問時是否安全. 多個線性安全的方法組合起來並不安全。安全
可重入鎖:同一個線程能夠屢次得到這個鎖 公平鎖:獲取鎖的時候按照請求的順序去得到。 非公平鎖:獲取鎖的時候不是按照請求的順序得到。jvm
非公平鎖,經過監視一個對象能夠鎖住代碼塊,或者直接加在方法前面。線程
靜態方法:鎖住當前Class對象。鎖的範圍靜態方法的範圍。。 非靜態方法:鎖住當前的這個對象。鎖的範圍只在當前對象。對象
把鎖以對象的方式封裝。 非公平鎖: new ReentrantLock(),先檢查隊列是否空,若是不是直接獲取,不然加到鏈表中 公平鎖:new ReentrantLock(true),直接先去獲取一下鎖,若是獲取不到則進入到一個鏈表中 ReentrantLock extends AbstractQueueSynchronizer(記錄當前鎖進入幾回,status) extends AbstractOwnableSynchronizer(記錄當前得到鎖的對象)排序
ReentrantLock內部有FairLock和NonfairLock兩個鎖的實現隊列
java線程工做的時候從主存裏面讀取數據到工做內存,在工做內存完成操做以後再寫入到主存裏。volatile可使得線程每次從主存裏面讀取,一個操做以後就強制寫回到主存中。內存
Object a = new Object(); 在jvm裏面是分爲三步來作的:it
Hashtable 每一個方法加上synchronized ConcurrentHashMap 經過分段的方式減小鎖的干預範圍 Collections.synchronizedMap() 把Map包了一層,每隔方法加了synchronized再調用Map本身的方法io
Vector Collections.synchronizedList() 把List包了一層,每一個方法加了synchronized再調用List本身的方法
LinkedBlockingQueue 鏈表 PrioriryBlockingQueue 有優先級的blockingqueue,先取出優先級高的對象 ArrayListBlackingQueue 內部利用ReentrantLock以及Condition實現。 Condition.signal Condition.await
put(); 阻塞 take(); 阻塞
add() 滿了拋出異常 offer() 滿了返回false
poll 刪除並返回第一個 peek 直接返回第一個