併發編程的藝術,讓一沒必要二

     併發是個長久問題,不少時間裏,咱們喜歡說,應該是這樣,多是。可是,不夠確定,要確定還得從書本上去肛答案。如下聊以藉慰。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。

相關文章
相關標籤/搜索