阿里巴巴编程规范实战(一):编程规约之并发处理

本文介绍了阿里巴巴编程规范在并发处理方面的强制性要求。强调了单例对象和线程安全的重要性,提倡使用线程池并避免直接创建线程,同时指出线程池不应使用Executors创建以防止资源耗尽。推荐使用ThreadPoolExecutor并详细解释了其参数含义和线程队列类型。此外,文章还讨论了SimpleDateFormat的线程安全问题,提倡使用ThreadLocal,并提醒在使用ThreadLocal时需要进行及时清理,以避免内存泄漏和影响线程池性能。最后,文章提出了并发修改记录时的锁策略,推荐使用悲观锁处理金融敏感信息,并建议避免使用Timer进行多线程定时任务,改用ScheduledExecutorService。
摘要由CSDN通过智能技术生成

1.【强制】获取单例对象需要保证线程安全,其中的方法也要保证线程安全。

说明:资源驱动类、工具类、单例工厂类都需要注意。

解释:因为不是线程安全,会创建不出真正的单例,有可能一个类有多个对象。

2.【强制】创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。

正例:自定义线程工厂,并且根据外部特征进行分组,比如机房信息。

public class UserThreadFactory implements ThreadFactory {

private final String namePrefix;

private final AtomicInteger nextId = new AtomicInteger(1);

  • 定义线程组名称,在 jstack 问题排查时,非常有帮助

UserThreadFactory(String whatFeaturOfGroup) {

namePrefix = "From UserThreadFactory's " + whatFeaturOfGroup + "-Worker-";

}

@Override

public Thread newThread(Runnable task) {

String name = namePrefix + nextId.getAndIncrement(); Thread thread = new Thread(null, task, name, 0, false);

System.out.println(thread.getName());

return thread;

}

}

3.【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。

说明:线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。

解释:就像我们使用各种连接池一样,jdbc连接池等。池化很重要。tcp和http一个长连接好处:效率高,减少了创建和销毁链接,http每次都得重新建立连接。

4.【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

说明:Executors 返回的线程池对象的弊端如下:

1FixedThreadPool SingleThreadPool

允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。

2CachedThreadPoolnewScheduledThreadPool

允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。

解释:看代码。thread包下ExecutorsTest。点进去:newFixedThreadPool,发现其实Executor都是基于ThreadPoolExecutor创建的,只不过传入不同的参数,

参数含义如下:

corePoolSize:线程池中核心线程数量。

maximumPoolSize:线程池最大线程数量。

keepAliveTime:超出核心线程数量时,多出的空闲线程的存活时间。

unit: keepAliveTim

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山竹之七语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值