線程池大小
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中的一個類加載器,某個類有且只有一個實例。這裏是同一線程只有一個實例。