API
低級別
Thread
1、實例化
1)實例化Runnable,構造Thread
2)構造Thread子類,實現run方法
2、重要方法
interrupt
實例方法
1)void interrupt()
如:t.interrupt() 主線程中斷線程t,設置中斷狀態標誌
2)boolean isInterrupted()
如:t.isInterrupted() 主線程查詢線程t中斷狀態,不會設置中斷狀態標誌
靜態方法
1)static boolean interrupted()
如:Thread.interrupted() 如果已被中斷,清除當前線程的中斷狀態標誌
高級別(5.0)
在java.util.concurrent包內
1、Lock
1)比隱含鎖的優勢在於,可以退回鎖,以解決死鎖問題
2、Executors
1)將線程管理和創建,同業務代碼分離;
2)使用工作線程可以最小化線程創建的開銷;
3)固定線程池可以避免系統超載
4)Fork/Join 利用多處理器提升性能,將任務劃分為遞歸的更小任務
3、Concurrent Collections
1)BlockingQueue 先進先出隊列
2)ConcurrentMap 原子操作,避免低效的同步
4、atomic
在一個變量上支持原子操作
5、ThreadLocalRandom
減少多線程徵用,獲得更好的性能
同步
問題
沒有同步造成的問題:1、線程干擾(導致結果不一致);2、內存一致性
同步造成的問題:1、死鎖,多個線程等待對方資源而阻塞;2、飢餓,共享資源長期被佔用;3、活鎖,多個線程等待對方響應而非常繁忙,沒有阻塞
解決
1、synchronized 同步
2、原子訪問(避免內存一致性問題)
1)引用變量和大部分基本變量的讀和寫是原子操作(除了long和double)
2)聲明為volatile的所有變量的讀和寫是原子操作(包括long和double)
3、immutable Object
4、滿足happens-before,即一條語句寫,對另一條語句可見。
1)synchronized方法退出,其他線程對synchronized方法調用
2)一個線程釋放內部鎖,另一個線程獲取同一個內部鎖
3)聲明為volatile的所有變量
閱讀更多 有趣的代碼 的文章