Java傳統的時間格式化的執行緒安全問題
以下程式碼會報錯:
package com.expgiga.Java8; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.*; /** * 測試傳統時間格式化的執行緒安全問題 */ public class TestSimpleDateFormat { public static void main(String[] args) throws ExecutionException, InterruptedException { SimpleDateFormat sdf = newSimpleDateFormat("yyyyMMdd"); Callable<Date> task = new Callable<Date>() { @Override public Date call() throws Exception { return sdf.parse("20170806"); } }; ExecutorService pool = Executors.newFixedThreadPool(10); List<Future<Date>> results = newArrayList<>(); for (int i = 0; i < 10; i++) { results.add(pool.submit(task)); } for (Future<Date> future : results) { System.out.println(future.get()); } } }
Java8之前的解決方法:
package com.expgiga.Java8; import java.text.DateFormat; importjava.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * */ public class DateFormatThreadLocal { private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() { protected DateFormat initialValue() { return new SimpleDateFormat("yyyyMMdd"); } }; public static Date convert(String source) throws ParseException { return df.get().parse(source); } }
package com.expgiga.Java8; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.*; /** * 測試傳統時間格式化的執行緒安全問題 */ public class TestSimpleDateFormat { public static void main(String[] args) throws ExecutionException, InterruptedException { // SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); Callable<Date> task = new Callable<Date>() { @Override public Date call() throws Exception { // return sdf.parse("20170806"); return DateFormatThreadLocal.convert("20170805"); } }; ExecutorService pool = Executors.newFixedThreadPool(10); List<Future<Date>> results = new ArrayList<>(); for (int i = 0; i < 10; i++) { results.add(pool.submit(task)); } for (Future<Date> future : results) { System.out.println(future.get()); } pool.shutdown(); } }
Java8的解決方法:
package com.expgiga.Java8; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.*; /** * 測試傳統時間格式化的執行緒安全問題 */ public class TestSimpleDateFormat { public static void main(String[] args) throws ExecutionException, InterruptedException { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd"); Callable<LocalDate> task = new Callable<LocalDate>() { @Override public LocalDate call() throws Exception { return LocalDate.parse("20170806", dtf); } }; ExecutorService pool = Executors.newFixedThreadPool(10); List<Future<LocalDate>> results = new ArrayList<>(); for (int i = 0; i < 10; i++) { results.add(pool.submit(task)); } for (Future<LocalDate> future : results) { System.out.println(future.get()); } pool.shutdown(); } }
相關推薦
JAVA複習資料-關於SimpleDateFormat安全的時間格式化執行緒安全問題
想必大家對SimpleDateFormat並不陌生。SimpleDateFormat 是 Java 中一個非常常用的類,該類用來對日期字串進行解析和格式化輸出,但如果使用不小心會導致非常微妙和難以除錯的問題,因為 DateFormat 和 SimpleDateFormat
SimpleDateFormat時間格式化執行緒不安全問題
想必大家對SimpleDateFormat並不陌生。SimpleDateFormat 是 Java 中一個非常常用的類,該類用來對日期字串進行解析和格式化輸出,但如果使用不小心會導致非常微妙和難以除錯的問題,因為 DateFormat 和 SimpleDateFormat 類
SimpleDateFormat時間格式化執行緒不安全問題_2
1. 原因 SimpleDateFormat(下面簡稱sdf)類內部有一個Calendar物件引用,它用來儲存和這個sdf相關的日期資訊,例如sdf.parse(dateStr), sdf.format(date) 諸如此類的方法引數傳入的日期相關String, Date等
Java日期格式化-執行緒安全
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templa
Java併發理論基礎—執行緒安全策略
不可變物件需要滿足的條件: 1、物件建立以後其狀態就不能修改 2、物件所有域都是final型別 3、物件是正確建立的(在物件建立期間,this引用沒有逸出) final關鍵字:類、方法、變數 修飾類:不能被繼承 修飾方法:1、鎖定方法不被繼承類修改;2、效率 修飾變數:基
Java語言中的執行緒安全
執行緒安全定義:當多個執行緒訪問一個物件時,如果不用考慮這些執行緒在執行時環境下的排程和交替執行,也不需要考慮進行額外的同步,或者在呼叫方進行任何其他的寫作操作,呼叫這個物件的行為都可以獲得正確的結果,那這個物件時執行緒安全的。 將Java語言中的各種操作共享的資料分為以下五類: 不可
Java併發程式設計(1)-執行緒安全基礎概述
文章目錄 一、執行緒安全性 1.1、無狀態類 1.2、有狀態類 二、原子性 2.1、原子操作 2.2、競爭操作 2.3、複合操作
Java併發程式設計之執行緒安全、執行緒通訊
Java多執行緒開發中最重要的一點就是執行緒安全的實現了。所謂Java執行緒安全,可以簡單理解為當多個執行緒訪問同一個共享資源時產生的資料不一致問題。為此,Java提供了一系列方法來解決執行緒安全問題。 synchronized synchronized用於同步多執行緒對共享資源的訪問,在實現中分為同步程
Java 單例模式執行緒安全問題
Java 單例模式執行緒安全問題 更新時間:2017年09月14日 11:30:42 作者:flycw 我要評論 這篇文章主要介紹了Java 單例模式執行緒安全問題的相關資料,希望通過本文大家能瞭解掌握單例模式中
【Java虛擬機器】執行緒安全與鎖優化
執行緒安全與鎖優化 絕對執行緒安全 相對執行緒安全 執行緒安全的實現方式 互斥同步 非阻塞同步 鎖優化 參考 絕對執行緒安全 當多個執行緒訪問一個物件時,如果不用考慮這些執行緒在執行時環境
java虛擬機器多執行緒安全的簡單理解
java虛擬機器多執行緒安全及鎖優化 執行緒安全問題的產生 多執行緒技術的引入產生啦執行緒安全性問題:當多個執行緒操作共享的資料時,如果A執行緒對共享的資料做出改變時B執行緒也要操作共享的資料,就有可能發生執行緒執行錯誤,產生錯誤的結果. 執行緒安全按安全程度來分五級
#Java&面試--控制多執行緒安全與順序執行
Condition類的signal則是喚醒被Condition類使用await作用的那個執行緒,它會有針對性的喚醒執行緒,而不是隨機喚醒一個執行緒,以保證執行緒執行的順序: package com.yzh.job.test; import java.util.c
Java併發程式設計:執行緒安全和ThreadLocal
執行緒安全的概念:當多個執行緒訪問某一個類(物件或方法)時,這個類始終都能表現出正確的行為,那麼這個類(物件或方法)就是執行緒安全的。 執行緒安全 說的可能比較抽象,下面就以一個簡單的例子來看看什麼是執行緒安全問題。 public class MyThread
java單例模式執行緒安全
關於單例模式的文章,其實網上早就已經氾濫了。但一個小小的單例,裡面卻是有著許多的變化。網上的文章大多也是提到了其中的一個或幾個點,很少有比較全面且脈絡清晰的文章,於是,我便萌生了寫這篇文章的念頭。企圖把這個單例說透,說深入。但願我不會做的太差。 首先來看一個典型的實
Java靜態工具類執行緒安全的一些建議
針對靜態方法有以下一些前提 靜態方法和例項方法的區別是靜態方法只能引用靜態變數,靜態方法通過類名來呼叫,例項方法通過物件例項來呼叫每個執行緒都有自己的執行緒棧,棧與執行緒同時建立,每一個虛擬機器執行緒都有自己的程式計數器PC,在任何時刻,一個虛擬機器執行緒只會執行一個方法的
Java中哪些是執行緒安全的容器?
同步容器類:使用了synchronized 1.Vector 2.HashTable 併發容器: 3.ConcurrentHashMap:分段 4.CopyOnWriteArrayList:寫時複製 5.CopyOnWriteArraySet:寫時複製 Queue: 6.Concur
程式碼驗證java的StringBuffer是執行緒安全而StringBuilder是執行緒不安全的
package practice; //通過反轉字串來驗證StringBuffer是執行緒安全而StringBuilder是執行緒不安全的 public class Practice { public static void main(String
基於Java容器類的執行緒安全程式設計
Collection ├List 介面│├LinkedList 連結串列│├ArrayList 順序結構動態陣列類│└Vector 向量│ └Stack 棧└Set Map ├Hashtable ├HashMap
java集合中的執行緒安全問題
1.Collection是無序的,允許元素重複 List集合是有序的,允許元素重複 Set集合 HashSet、AbstractSet集合是無序的,TreeSet集合是有序的,不允許元素重複,
Java高併發程式設計學習筆記(三):Java記憶體模型和執行緒安全
文章目錄 原子性 有序性 可見性 – 編譯器優化 – 硬體優化(如寫吸收,批操作) Java虛擬機器層面的可見性 Happen-Before規則(先行發生) 程式順序原則: volat