《Java多線程編程實戰指南-設計模式篇》筆記

線程池大小

1.CPU密集型:考慮設置 Cpu數+1
2.I/O密集型:考慮設置 2*Cpu數

線程泄漏(Thread Leak)

含義:指線程池中的工作者線程意外中止,使得線程池中實際可用的工作者線程變少。如果線程泄漏持續存在,那麼線程池中的工作者線程會越來越少,導致線程池無法處理交給其的任務。
例子:SocketInputStream.socketRead0引起線程池提交任務後,futureTask.get超時

正確的預防方式

1.處理可恢復的異常。
2.設置超時等待。

ThreadLocal的使用

a.使用ThreadLocal做一個線程安全的工具類。

如:SecureRandom使用的時候,初始化比較耗時,且nextInt是一個同步的方法,當多個線程大量調用的時候會引起競爭,從而降低效率。

方法:
1.可以使用ThreadLocal爲每個線程set一個SecureRandom的實例。
2.可以繼承ThreadLocal,實現一個子類,其成員變量持有一個SecureRandom的實例。

threadLocal適用的場景:

1.需要使用非線程安全的對象,又不想引入鎖。
2.使用線程安全對象,但希望避免其使用到鎖的開銷和相關問題。
3.隱式的參數傳遞:同一線程內全局對象。
4.特定線程的單例模式:不同於常見的單例是一個jvm中的一個類加載器,某個類有且只有一個實例。這裏是同一線程只有一個實例。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章