SimpleDateFormat

@Test
public void testParse() {
    ExecutorService executorService = Executors.newCachedThreadPool();
    List<String> dateStrList = Lists.newArrayList(
            "2018-04-01 10:00:01",
            "2018-04-02 11:00:02",
            "2018-04-03 12:00:03",
            "2018-04-04 13:00:04",
            "2018-04-05 14:00:05"
    );
    /**
     * 注意這個地方很容易犯錯!!!
     * 因此這裏 SimpleDateFormat 對象是不能公用的!!!
     */
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    for (String str : dateStrList) {
        executorService.execute(() -> {
            try {
                simpleDateFormat.parse(str);
                TimeUnit.SECONDS.sleep(1);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }

併發環境下使用SimpleDateFormat的parse方法有線程安全問題!java

  • 線程安全問題的緣由:
    • 在SimpleDateFormat轉換日期是經過Calendar對象來操做的
      • 若是此時線程A將calendar清空且沒有設置新值,
      • 線程B也進入parse方法用到了SimpleDateFormat對象中的calendar對象,
      • 此時就會產生線程安全問題!
相關文章
相關標籤/搜索