天天看點

多線程詳解2:并發

并發:同一個對象多個線程同時操作  對資料存在修改的情況需要保證資料的正确和安全

線程同步:多線程進入這個對象的等待池 形成隊列,對象加上鎖

  synchronized  鎖 

 引起的問題:性能問題,會比較慢

 具體實作: 成員方法鎖this 靜态方法鎖class

同步方法:鎖的是目前對象 

同步塊:鎖具體的對象

synchronized(obj){} obj被稱之為同步螢幕 

盡可能鎖定合理的範圍

CopyOnWriteArrayList   并發容器

死鎖:過多的同步可能會造成互相不釋放資源

多個線程各自占有一些共享資源,并且互相等待一些其他線程共享資源才能進行

不要在同一個代碼塊 互相持有多個對象的鎖

并發協作 :生産者消費者模式   線程通信

服務層 應用層互動  進行解耦

wait 線程一直等待 會釋放鎖  

notify 喚醒一個等待狀态的線程

notifiyAll 喚醒同一個對象上所有調用wait的線程

管程法

       緩沖區:容器+計數器

        需要判斷何時消費  何時生産

信号燈法

       标志位:需要修改标志位

補充:

HappenBefore 指令重排

執行代碼的順序可能與編寫代碼不一緻 虛拟機優化代碼順序 指令重排

有資料依賴性 不會重排

指令重排 :代碼執行順序與預期不一緻

解決方法:volatile 輕量的 synchronized

保證線程間變量的可見性   提高執行效率 不能保證原子性

DCL單例模式

ThreadLocal

在多線程環境下,每個線程都有自己的資料

CAS:比較并交換   很高效的解決原子操作   AtomicInteger  

樂觀鎖 :失敗就重試

加版本号 比較并交換 

比較版本号 相同 修改,不同則無法修改   

繼續閱讀