[8]-併發

宏觀:concurrent包

  • atomic包: AtmoicInteger
  • locks包:Lock、Condition、ReetrantLock

  • Callable、Future
  • Exector、ExecutorService
  • CountDownLatch、CyclicBarrier
  • ConcurrentHashMap


//AtmoicInteger
//(預期值,新值) 當前值==預期值,當前值=新值 
public final int getAndIncrement(){
    for(;;){
        int current=get();
        int next=current+1;
        if(compareAndSet(current,next)){
            return current;
        }
    }
}


線程池:threadPoolExector.execute

  • coreNum、maxNum、
  • ThreadFactory、BlockingQueue、
  • 飽和策略、時間、時間單位)

  • amount< coreNum:ThreadFactory創建線程
  • amount< maxNum
    • 阻塞隊列未滿:BlockingQueue阻塞隊列
    • 阻塞隊列已滿:ThreadFactory創建線程
  • amount>=max
    • 誰提交請求、誰處理
    • 拋異常、catch處理
    • 丟了這個請求
    • 丟了隊列最早請求

線程讓出cpu

  • yield():就緒:讓給相同/更高:t1.setPriority(1-10,5)
  • wait():阻塞:釋放鎖
  • sleep():阻塞:不釋放鎖
  • join():阻塞:main調用t1.join(),main阻塞,直到t1結束

中止一個線程

  • suspend():立刻、不釋放鎖

  • interrupt():只能用於阻塞態,拋InterruptedException異常

    • wait:等鎖;sleep:立刻;join:立刻
  • stop()
    • run()不同步:釋放鎖、拋ThreadDeath、可能不一致
    • run()同步:stop()也是同步,得不到鎖、無法中止

synchronized

  • 提供了與對象相關的隱式監視器鎖的訪問
  • 鎖的獲取和釋放要出現在一個塊結構中,鎖的釋放是隱式的
  • 獲取多個鎖時, 必須以相反的順序釋放
  • JVM 在生成線程轉儲時能夠包括鎖定信息

ReentrantLock

  • Lock機制必須顯式、在finally釋放:locl.unlock()
    • 鎖的獲取和釋放不必要在同一個塊中
    • 釋放鎖的順序更加自由

都是可重入鎖

  • 同一個線程多次試圖獲取它所佔有的鎖,請求會成功。
  • 當釋放鎖的時候,直到重入次數清零,鎖才釋放完畢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章