1、线程不安全的类
如果一个类的对象同时可以被多个线程访问,并且你不做特殊的同步或并发处理,那么它就很容易表现出线程不安全的现象。比如抛出异常、逻辑处理错误…
下面列举一下常见的线程不安全的类及对应的线程安全类:
(1)StringBuilder 与 StringBuffer
StringBuilder是线程不安全的,而StringBuffer是线程安全的。分析源码:StringBuffer的方法使用了synchronized关键字修饰。
1 |
|
(2)SimpleDateFormat 与 jodatime插件
SimpleDateFormat 类在处理时间的时候,如下写法是线程不安全的:
1 | private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); |
但是我们可以变换其为线程安全的写法:在每次转换的时候使用线程封闭,新建变量
1 | private static void update() { |
另外我们也可以使用jodatime插件来转换时间:其可以保证线程安全性
Joda 类具有不可变性,因此它们的实例无法被修改。(不可变类的一个优点就是它们是线程安全的)
1 | private static DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyyMMdd"); |