1:靜態條件
基於一種可能失效的觀察結果做出判斷或執行某個計算
2:原子性
3:可見性
原子性是說乙個操作是否可分割。可見性是說操作結果其他執行緒是否可見。這麼看來他們其實沒有什麼關係。
4:volatile變數解釋
用來確保將變數的更新操作通知到其他執行緒,當把變數宣告為volatile型別後,編譯器與執行時都會注意到這個變數是共享的,因此不會將該變數上的操作與其他記憶體操作儀器重新排序,volatile變數不會被快取在暫存器或者對其他處理器不可見的地方。因此在讀取volatile型別的變數時總會返回最新寫入的新值。訪問volatile變數不會執行加鎖操作,因此就不會有執行緒阻塞,因此volatile變數是一種比sychronized更輕量級的同步機制。
volatile變數通常用做,某個操作完成,發生中斷或者狀態的標誌,但是不足以確保遞增操作的原子性,加鎖能確保可見性與原子性。
5:發布與逸出
發布:使物件能夠在當前作用域之外的**中使用
逸出:當某個不應該發布的物件被發布時
6:同步容器類
同步容器類包括vector 和 hashtable 他們實現執行緒安全的方式是:將他們的狀態封裝起來,並對每個公有方法都進行同步,使得每次只有乙個執行緒能訪問容器的狀態。
同步容器類都是執行緒安全的,但有些情況下可能需要額外的客戶端加鎖來保護復合操作。例如容器迭代過程中併發修改,需要獲得這個容器的自身的鎖,但是可能會出現死鎖或飢餓。如果不希望在迭代期間對容器加鎖,那麼一種替代方法就是轉殖,在副本上進行迭代。當發現容器在迭代過程中被修改時,就會丟擲乙個concurrentmodificationexception.還考慮隱藏迭代器:tostring,hashmap,equals。
concurrenthashmap 也是乙個基於雜湊的map,並不是將每個方法都在同乙個鎖上同步並使得每次只能有乙個執行緒訪問容器,而是使用一種粒度更細的加鎖機制來實現更大程度的共享,這種機制稱為分段鎖。他提供的迭代器不會丟擲concurrentmodificationexception,因此不需要在迭代過程中加鎖。
java多執行緒
在網上看到很有意思的問題,摘下來好好看下 在面試的時候被問了乙個多執行緒的問題 回來仔細思考了一下,多執行緒是否真的能提高了效率?我對多執行緒的理解就是 比如挖乙個隧道,有2種開工方法 1 只在山的一頭挖,直至挖到山的另一頭,從而打通隧道,這可以看成是單執行緒 2 在山的兩頭挖,同時開工,最後在山的...
Java 多執行緒
1。thread類和runnable介面 2。主線程 用thread的static thread currentthread 方法獲得 3。通過實現runnable介面建立執行緒 實現runnable介面的run方法。新執行緒在run 方法返回時結束。注意用這種方法建立程序時,在實現runnable...
JAVA 多執行緒
為hashmap的不正確使用所導致。hashmap在多執行緒環境下使用不安全。使用靜態hashmap作為聯絡人資料快取,key為手機號碼.private static maplxrdata new hashmap 多執行緒環境下不同步hashmap可能導致如下問題 1 多執行緒put操作後可能導致g...