什么是线程不安全的类?
如果一个类的对象同时被多个线程访问,如果不做特殊的同步或并发处理,很容易表现出线程不安全的现象,比如抛出异常、逻辑处理错误等,这种类我们就称为线程不安全的类。
常见的线程不安全的类有哪些?
在此处主要讲解下SimpleDateFormat类以及JodaTime
SimpleDateFormat是线程不安全的类 例如:
public class DateFormatExample1 {
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
public static int clientTotal = 1000;//请求总数
private static void update() throws ParseException {
simpleDateFormat.parse("20181008");
}
public static void main(String[] args)throws Exception {
ExecutorService executorService = Executors.newCachedThreadPool(); //定义线程池
for (int i = 0; i < clientTotal; i++)
executorService.execute(() -> {
try {
update();
} catch (ParseException e) {
e.printStackTrace();
}
});
}
}
而解决这个问题的方法是可以采用堆栈封闭的方式
public class DateFormatExample2 {
public static int clientTotal = 1000;//请求总数
private static void update() throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
simpleDateFormat.parse("20180208");
}
public static void main(String[] args)throws Exception {
ExecutorService executorService = Executors.newCachedThreadPool(); //定义线程池
for (int i = 0; i < clientTotal; i++)
executorService.execute(() -> {
try {
update();
} catch (ParseException e) {
e.printStackTrace();
}
});
}
}
而jodatime提供了一个DateTimeFormatter类,这个类是线程安全的,并且在实际应用中还有更多的优势。所以在实际的开发中推荐使用jodatime
使用时首先需要添加maven依赖包
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9</version>
</dependency>
public class DateFormatExample2 {
public static int clientTotal = 1000;//请求总数
private static DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyyMMdd");
private static void update() throws ParseException {
dateTimeFormatter.parseDateTime("20181008");
}
public static void main(String[] args)throws Exception {
ExecutorService executorService = Executors.newCachedThreadPool(); //定义线程池
for (int i = 0; i < clientTotal; i++)
executorService.execute(() -> {
try {
update();
} catch (ParseException e) {
e.printStackTrace();
}
});
}
}
参考地址:
来源:oschina
链接:https://my.oschina.net/u/2634007/blog/2231284