并發:同一個對象多個線程同時操作 對資料存在修改的情況需要保證資料的正确和安全
線程同步:多線程進入這個對象的等待池 形成隊列,對象加上鎖
synchronized 鎖
引起的問題:性能問題,會比較慢
具體實作: 成員方法鎖this 靜态方法鎖class
同步方法:鎖的是目前對象
同步塊:鎖具體的對象
synchronized(obj){} obj被稱之為同步螢幕
盡可能鎖定合理的範圍
CopyOnWriteArrayList 并發容器
死鎖:過多的同步可能會造成互相不釋放資源
多個線程各自占有一些共享資源,并且互相等待一些其他線程共享資源才能進行
不要在同一個代碼塊 互相持有多個對象的鎖
并發協作 :生産者消費者模式 線程通信
服務層 應用層互動 進行解耦
wait 線程一直等待 會釋放鎖
notify 喚醒一個等待狀态的線程
notifiyAll 喚醒同一個對象上所有調用wait的線程
管程法
緩沖區:容器+計數器
需要判斷何時消費 何時生産
信号燈法
标志位:需要修改标志位
補充:
HappenBefore 指令重排
執行代碼的順序可能與編寫代碼不一緻 虛拟機優化代碼順序 指令重排
有資料依賴性 不會重排
指令重排 :代碼執行順序與預期不一緻
解決方法:volatile 輕量的 synchronized
保證線程間變量的可見性 提高執行效率 不能保證原子性
DCL單例模式
ThreadLocal
在多線程環境下,每個線程都有自己的資料
CAS:比較并交換 很高效的解決原子操作 AtomicInteger
樂觀鎖 :失敗就重試
加版本号 比較并交換
比較版本号 相同 修改,不同則無法修改