失效链接处理 |
java并发规范(线程及锁) PDF 下载
本站整理下载:
相关截图:
主要内容:
Rule 1. 【强制】创建线程或线程池时请指定有意义的线程名称,方便出错时回溯
Rule 2. 【推荐】尽量使用线程池来创建线程
Rule 3. 【强制】线程池不允许使用 Executors去创建,避资源耗尽风险,推荐用ThreadPoolExecutor创建线程池
Rule 4. 【强制】正确停止线程
Rule 5. 【强制】编写可停止的Runnable
5.1 正确处理InterruptException
5.2 主循环及进入阻塞状态前要判断线程状态
Rule 6. 【强制】Runnable中必须捕获一切异常
Rule 7. 【强制】全局的非线程安全的对象可考虑使用ThreadLocal存放
Rule 8. 【推荐】缩短锁
8.1 能锁区块,就不要锁整个方法体;
8.2 能用对象锁,就不要用类锁。
Rule 9. 【推荐】选择分离锁,分散锁甚至无锁的数据结构
Rule 10. 【推荐】基于ThreadLocal来避免锁
Rule 11. 【推荐】规避死锁风险
Rule 12. 【推荐】volatile修饰符,AtomicXX系列的正确使用
Rule 13. 【推荐】延时初始化的正确写法
Rule 1. 【强制】创建线程或线程池时请指定有意义的线程名称,方便出错时回溯
(1)创建单条线程时直接指定线程名称
Thread t = new Thread();
t.setName("cleanup-thread");
(2) 线程池则使用guava或自行封装的ThreadFactory,指定命名规则。
ThreadFactory threadFactory = new ThreadFactoryBuilder().
setNameFormat(threadNamePrefix + “-%d”).build();
ThreadPoolExecutor executor = new ThreadPoolExecutor(…, threadFactory, …);
Rule 2. 【推荐】尽量使用线程池来创建线程
除特殊情况,尽量不要自行创建线程,更好的保护线程资源。
同理,定时器也不要使用Timer,而应该使用ScheduledExecutorService。
因为Timer只有单线程,不能并发的执行多个在其中定义的任务,而且如果其中一个任务抛出异常,整个Timer也会挂掉,而ScheduledExecutorService只有那个没捕获到异常的任务不再定时执行,其他任务不受影响。
Rule 3. 【强制】线程池不允许使用 Executors去创建,避资源耗尽风险
Executors返回的线程池对象的弊端 :
|