多線程進階
主題:多線程進階
多線程的一些核心內容以及要關註的細節。
一、線程的實現
繼承thread類重寫run()方法和實現Runnable接口實現run()方法
註意點:new線程實例時建議加線程名和要處理下線程的中斷異常([InterruptedException])
二、不得不提的[ThreadLocal]
顧名思義:線程局部變量,提高性能,可以理解為對線程的“工廠模式”。
註意點:不能解決多線程環境下的數據共享的問題。
使用[ThreadLocal],一般都是聲明在靜態變量中。如果不斷的創建[ThreadLocal]而且沒有調用其remove方法,將會導致內存泄露。如果是static的[ThreadLocal],一般不需要調用remove。
三、線程的同步與鎖
普通鎖:Synchronized。方法上(靜態或非靜態)加。
讀寫鎖:接口[ReadWriteLock]、實現[ReentrantReadWriteLock]。性能高,一般建議用這個。
四、線程的調度
wait/(notify/notifyAll())機制
同在Synchronized代碼塊中有效。
wait/sleep的區別
wait釋放鎖,sleep沒有。
線程的讓步yield()和合並join()
五、阻塞隊列
java.util.concurrent.[BlockingQueue]、[ArrayBlockingQueue], [DelayQueue], [LinkedBlockingQueue], [PriorityBlockingQueue], [SynchronousQueue]
為多線程的排隊等候的業務場景開辟了便捷通道,非常有用
六、線程池
Executors、[ExecutorService和Future]
Future的get ()和get (long timeout, [TimeUnit] unit)方法
對有高性能要求的中間件或者定時任務的實現非常有用。如我們的R系統
最後火青還給大夥總結要註意以下三點:
1、編碼時要註意靜態或者非靜態成員變量等是否有線程不安全問題。
2、不要隨便使用Synchronized。
3、盡量用java5的自帶的api實現多線程。
多線程進階