软件开发

当前位置:首页 > 软件开发

阿里Java开发手册(续)

19.【推荐】高度注意 Map 类集合 K/V 能不能存储 null 值的情况,如下表格:

性能测试进阶指南——用户行为模拟(续)

反例:由于 HashMap 的干扰,很多人认为 ConcurrentHashMap 是可以置入 null 值,而事实上,存储 null 值时会抛出 NPE 异常。

20.【参考】合理利用好集合的有序性(sort)和稳定性(order),避免集合的无序性(unsort)和不稳 定性(unorder)带来的负面影响。

说明:有序性是指遍历的结果是按某种比较规则依次排列的。稳定性指集合每次遍历的元素次序是一定的。 如:ArrayList 是 order/unsort;HashMap 是 unorder/unsort;TreeSet 是 order/sort。 

21.【参考】利用 Set 元素唯一的特性,可以快速对一个集合进行去重操作,避免使用 List 的 contains()进行遍历去重或者判断包含操作。

(七) 并发处理 

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

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

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

正例:自定义线程工厂,并且根据外部特征进行分组,比如,来自同一机房的调用,把机房编号赋值给 whatFeatureOfGroup

public class 
UserThreadFactory 
implements 
ThreadFactory 
{ 
 
private final 
String namePrefix
; 
 
private final 
AtomicInteger nextId 
= 
new 
AtomicInteger
(
1
); 
 
// 定义线程组名称,在利用 jstack 来排查问题时,非常有帮助 
 
UserThreadFactory
(
String whatFeatureOfGroup
) { 
 namePrefix 
= 
"From UserThreadFactory's " 
+ 
whatFeatureOfGroup 
+ 
"-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. 【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。

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

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

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

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

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

5. 【强制】SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为 static必须加锁,或者使用 DateUtils 工具类。

正例:注意线程安全,使用 DateUtils。亦推荐如下处理:

private static final 
ThreadLocal
<
DateFormat
> 
df 
= 
new 
ThreadLocal
<
DateFormat
>() { 
 
@Override 
 
protected 
DateFormat 
initialValue
() { 
 
return new 
SimpleDateFormat
(
"yyyy-MM-dd"
); 
 
} 
};

说明:如果是 JDK8 的应用,可以使用 Instant 代替 Date,LocalDateTime 代替 Calendar, DateTimeFormatter 代替 SimpleDateFormat,官方给出的解释:simple beautiful strong immutable  thread-safe。


相关内容

文章评论

表情

共 0 条评论,查看全部
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~