Why is the thread unsafe when using SimpleDateFormat?
In order to solve the problem of thread unsafety when using SimpleDateFormat, this article introduces the corresponding analysis and solution in detail, hoping to help more partners who want to solve this problem to find a more simple and easy way.
An example is given to describe the failure of SimpleDateFormat to process data as expected in the case of multithreading.
Use the thread pool to execute the task, adding the number of days of the date by 1 at a time. In the case of multithreading, the result is not the expected value.
Public class SimpleDateFormatInMultiThread {private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss"); private static ThreadFactory namedThreadFactory = new ThreadFactoryBuilder (). SetNameFormat ("demo-pool-%d"). Build (); private static ExecutorService pool = new ThreadPoolExecutor (5,200,90L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue (1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy ()); private static CountDownLatch countDownLatch = new CountDownLatch (50) / * how to solve the problem of SimpleDateFormat thread unsafety * 1 using local variables * 2 and synchronization locks alone in threads * 3 using threadlocal using independent thread objects * 4 using DateTimeFormat in java8 instead of * * @ param args * @ throws InterruptedException * / public static void main (String [] args) throws InterruptedException {Set dates = Collections.synchronizedSet (new HashSet ()) For (int I = 0; I {countDownLatch.countDown (); calendar.add (Calendar.DATE, finalI); String dateString; synchronized (simpleDateFormat) {dateString = simpleDateFormat.format (calendar.getTime ());} dates.add (dateString);});} countDownLatch.await () System.out.println (dates.size ());}}
If there are element duplicates in the collection, how to avoid data inconsistencies?
1 use the synchronization keyword synchronized to lock concurrent statements
2 use independent variables
3 use ThreadLocal to assign format objects that do not affect each other to each thread
4 formatted with thread-safe classes, DateTimeFormat classes are provided in java8
This is the answer to the question about why there is thread unsafety in the use of SimpleDateFormat. I hope the above content can be of some help to you. If you still have a lot of doubts to be solved, you can follow the industry information channel for more related knowledge.