编程小记
开发中接触到的新的编程注意点
实际工作上手开发的过程中,虽然已经对java开发基础有了一定的了解,可以应用基本数据类型,获得参数,进行相应处理,但在考虑并发编程的情况下,对于锁,线程池等应用还是发现距离正规的开发流程有一定差距,所以在此记录一些注意的地方,算是总结提醒自己。
- 并发编程环境下 ,多使用单例模式,减少同一个类加载多次去发送消息,在类中加入单例方法,将发送消息的操作抽取出来放入;
- 注意线程池的应用,在某些情况下,比如可能有多个客户端向服务器发送请求时,可以预先设置线程池,减少创建线程所造成的开销。
线程池具体构造方法可以如下:
tmpThreadPool.execute(() -> {
try {
//执行需要在单个线程中进行的操作
}catch (Exception e){
//打log,或抛异常
}
});
3、构造函数的使用,和上述线程池配合使用,在创建类对象时,就建造一个线程池,避免重复构建线程池,造成的的不必要系统开销。
tmpThreadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit,
new ArrayBlockingQueue<>(1000), new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.out.println("此部分为拒绝线程时所进行的处理,可以是打日志进行记录");
}
});//示例中使用的是RejectedExecutionHandler,还有其他handler可以选择,此处不举例
4、锁的使用,当需要建立某一个具体的资源对象时,可以使用锁,防止多并发情况下,对同一资源对象重复更改,最好加上double check,保证创建的资源对象不浪费。第一次是为了不必要的同步,第二次是在singleton等于null的情况下才创建实例。
//producer示例
Producer<String, String> producer = cache.get(topicName);
if (producer == null) {
synchronized (Lock) {//此处获得同步锁以后,将获取的资源对象再次进行获取,防止获取错误的资源对象
//再次获取资源对象
if (producer == null) {
//创建并更新资源对象
}
}
}
5、DisposableBean,在整个类中获取完资源对象进行相应操作后,将资源对象进行释放。