java并发编程——线程不安全的类

心已入冬 提交于 2019-11-28 19:23:53

什么是线程不安全的类?

如果一个类的对象同时被多个线程访问,如果不做特殊的同步或并发处理,很容易表现出线程不安全的现象,比如抛出异常、逻辑处理错误等,这种类我们就称为线程不安全的类。

常见的线程不安全的类有哪些?

在此处主要讲解下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();
               }
           });
   }
}

参考地址:

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!