併發是個長久問題,不少時間裏,咱們喜歡說,應該是這樣,多是。可是,不夠確定,要確定還得從書本上去肛答案。如下聊以藉慰。java
Syncronized 修飾方法時,同一個類中的全部syncronized 方法只能有一個方法被訪問算法
syncronized修復對象時,則只能影響到對象,不會阻止其餘方法被訪問安全
在生產/消費場景中,因爲須要對兩個不一樣的方法進行同步,所以只能修飾方法,使其只能執行一個。併發
jmm內存模型,as-if-serial, happens-before. 無論怎麼樣重排序,都不能影響結果。內存屏障,保證處理器不能重排序,編譯器不能重排序。app
valatile是最輕量級的線程安全鎖,它能夠輕鬆保證一個變量的內存可見性。框架
cas是性能最高的一種原子操做實現,但存在ABA問題,能夠增長變量版本號來避免ABA問題。工具
jmm內存模型,syncronized, volatile, final 內存語義。順序一致性,重排序。性能
單例模式的坑,new xxxObj(); 是非線程安全的,可使用valatile或者內部類保證單例安全,final變量會在實例化或者使用該類以前完成初始化。final先後也產容許重振序。線程
經過使用內存屏障保證重排順序,StoreStore, StoreLoad, LoadLoad, LoadStore 屏障類型。對象
wait阻塞是經過monitor enter exit 實現的。Thread.join()實現線程等待終止。
java中的鎖
Lock接口,可使用多個鎖,syncronized作不到。
同步隊列是一個fifo雙向隊列,head tail。鎖通常都須要設置超時。
ReentrantLock 重入鎖,ReentrantReadWriteLock 讀寫鎖,更高效讀寫。LockSupport工具,park阻塞。Condition接口,lock.newCondition();輕鬆實現多鎖功能(空滿兩個鎖配合)。
java併發容器和框架
ConcurrentHashMap, doug lea, 分段鎖高效。使用hash算法定位segment,再hash進行定位元素。
阻塞隊列,ArrayBlockingQueue, LinedBlockingQueue, PriorityBlockingQueue, DelayQueue, SyncronousQueue, LinkedTransferQueue, LinkedBlockingQueue.
countDownLatch 制定要鏈接池總數,每使用一個,end countDL就countdown, 從而達到總數限制的做用。CyclicBarriar, 等到全部線程都到達屏障後,再一塊兒作某件事,能夠用來作真正的併發請求。
Fork/Join框架。將大任務拆小,再匯聚結果。
原子類操做
AtomicBoolean, AutomicInteger, Auto。
AutomicLongArray,
線程池的使用
Threadpool。
Executors。