1.併發不必定比串行更快 由於併發有線程建立和上下文切換的開銷
2.java的併發採用內存共享模型
3.單線程中重排序不會影響到結果 但多線程中重排序可能會影響到結果
4.votaile變量 當線程A修改votatile變量會更加主內存發送信息給B線程 修改的值刷新到主內存 被通知的線程將本地內存的votaile值設爲無效 讀取主內存更新的值 但只能保證其線程的可見性 不能保證原子性
5.votaile相比鎖是輕量級的同步 簡易性和可收縮性 不會形成線程阻塞 也就不會形成死鎖問題 性能更高 votaile讀操做和非votaile讀操做性能同樣 但寫操做比非votaile寫操做性能更低 若是線程變量讀操做遠多於寫操做 voatile提升比鎖提升更低的效率 適用 狀態標記 boolean 一次性發布 在整個項目運行中不會存在這個變量的非原子性操做
6.CAS和votaile是ReentantLock和concurrent包的基石
7.樂觀鎖和悲觀鎖 獨佔鎖就是悲觀鎖 sychronized就是獨佔鎖 讓須要鎖的線程掛起等待持有鎖線程的
釋放樂觀鎖的實質是採用CAS 在不加鎖 假設不衝突的狀況下完成某項操做 若是衝突則重試直到成功 爲止內部實現是經過java native 方法(JNI) CAS的缺陷 第一 ABA問題 當某個值爲A 修改成B 但又改成 A 經過加版本的方式解決(時間戳)第二 循環時間長開銷大 經過CPU暫停指令解決 第三隻能對一個 共享變量進行原子性操做 能夠採用多個變量合併的方式
8.JMM的核心是happens_before 對於鎖若是隻有單個線程訪問則能夠將鎖消除 votaile變量若是隻有單個線程訪問則能夠將votaile變量當成普通變量
9.越是追求性能的處理器 內存模型設計就越弱
10.守護線程不能經過finally中的輸出語句來判斷程序執行完畢和內存資源的釋放 由於程序執行完畢也不必定會執行try finally中的語句
11.在開啓線程使最好給線程取好線程名 以便可以快速查找問題所在
12.在獲取同步狀態時 同步器會維護一個同步隊列 獲取同步狀態失敗的線程被加入到同步隊列中進行自旋 獲取同步狀態成功的線程也就是同步隊列的頭結點出隊或者被中斷就會被喚醒本身結點的後繼結點獲取到同步狀態
13.synchronized能隱式的重入鎖 lock方法則不能夠但能夠顯式再調用lock方法獲取鎖
14.排他鎖 非公平鎖可能形成線程飢餓 但減小了線程的切換 保證了更大的吞吐量 效率更高
15.讀寫鎖 寫鎖是可重進入的排他鎖 讀鎖是可重進入的共享鎖 一個int變量記錄讀寫鎖的狀態 讀鎖佔
高16位寫鎖佔低16位(1<<16) 讀寫鎖 鎖降級是否必要 答案是必要的由於 雖然獲取讀鎖 有寫鎖獲取時 則會被進入等待狀態 但寫鎖獲取以前可能有讀鎖獲取到讀鎖 因此須要鎖降級再次獲取讀鎖進行數據同步
16.LockSupport類主要是用來阻塞和喚醒隊列 ReentantLock內部主要是經過votaile技術和CAS技術實現同步 內部有同步器對同步隊列和等待隊列的操做 獲取同步狀態時 同步器會將獲取失敗的線程放入同步隊列中 當同步隊列頭結點即獲取到同步狀態的被中斷或者是被移除同步隊列 會喚醒後繼結點獲取同步狀態 LockSupport能夠將線程在等待隊列和同步隊列之間切換
17.ConcurrentHashMap內部是segment類和HashEntry數組 Segment繼承了ReentantLock類實現同步操做 將map中的數據分爲多段 每段的長度會不同 並加上鎖 put方法是在segment上進行擴容加數據 採用的是哈希散列的方式再計算多段數據長度和時須要同步modCount方法判斷容器是否有修改
18.ConcurrentLinkedQueue的入隊方法永遠返回的是true 不能經過入隊方法判斷是否入隊成功
19.java是不能直接訪問操做系統底層 只能經過本地方法訪問 Unsafe是硬件級別的原子操做
第一 能夠分配內存和釋放內存 第二 阻塞和恢復線程(LockSupport) 第三CAS操做 第四 能夠定位某對象的字段內存位置和修改對象字段值 即便是私有的
20.能夠原子的更新引用類型 字段類 基本類型 數組 (AtomicReference)
21.CountDownLatch就是計數器當減到0時 await就不會阻塞當前線程了和CyclicBarrir的
22.Excharger類實現線程直接的交換數據
23.線程池的優勢 第一 下降資源消耗 第二 縮短響應時間 第三提升對線程的管理性 線程的分配 調優 監控
24.線程池 當有個新任務進入線程池 沒滿則會建立新線程處理 若是線程池的基本數量的核心線程已經滿了 會判斷工做隊列是否滿了 沒滿則會放入阻塞隊列中 若是滿了 會讓線程池建立新的線程處理這個任務 若是線程數量已經達到最大數量 則會執行飽和策略 默認是會報錯 任務執行完了會去查看工做隊列是否有任務若是有則會取出執行這個任務 若是工做隊列空 而且當前線程池的線程數量大於基本數量則會被銷燬 shutdown 和 shutdownNow方法 shutdownNow方法
25.建議使用有界的阻塞隊列 須要有線程池的監控以方便知道線程各類狀況 好比最大線程數
26.Excutors 方法fixThradPool CachedThreadPool是大小無界的線程池 適用於短時間異步執行的小程序 負載較輕的服務器
27.FutureTask未啓動 時調用futureTask.cancel會致使任務不會被執行 FutureTask啓動時 futureTask.cancel(true)會以中斷的方式使任務 任務已經執行完 futureTask.cancel(*)會返回false
28.for(;;)好比while(1)好的緣由是指令少 不怎麼佔用寄存器 沒有判斷跳轉
29.AQS實現的同步器於 ReentantLock ReentantReadWriteLock Semphore CountDownLatch FutureTask
30.多線程項目是比較難調試 因此須要打印好日誌信息 以便及時查找問題所在 異常處理打印日誌
和同步linux命令查看系統cup等相關的信息
31.ps -eLf}grep java -c 查看線程數是否增加
netstat -nat|grep 3306 -c 查看指定端口的數據庫鏈接數
cat /proc/net/dev 查看網絡流量
cat /proc/loadavg 查看系統平均負載
cat /proc/meminfo 查詢系統內存使用狀況
cat /proc/stat 查看CPU的利用率
32.根據任務類型或者任務的優先級進行不一樣線程池的處理