多线程场景下利用ThreadLocal是线程安全?
生活随笔
收集整理的這篇文章主要介紹了
多线程场景下利用ThreadLocal是线程安全?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 背景
- 多線程場景測試代碼
- 結論
背景
ThreadLocal原理以及基本概念這里我就不介紹了,這里我們主要關注ThreadLocal是否是線程安全嗎?其實如果我們知道ThreadLocal原理我們肯定知道它是線程安全的,但是我在開發的時候不放心做了個測試,也順便把測試demo貼一下
多線程場景測試代碼
多線程測試代碼:
package net.dreamzuora.utils;import java.util.UUID; import java.util.concurrent.*;public class ThreadLocalMultiThread {ThreadLocal<String> threadLocal = new ThreadLocal<>();public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(1);ThreadPoolExecutor.CallerRunsPolicy callerRunsPolicy = new ThreadPoolExecutor.CallerRunsPolicy();ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<>(200), new MyThreadFactory(), callerRunsPolicy);ThreadLocalMultiThread threadLocalMultiThread = new ThreadLocalMultiThread();for (int k =0; k < 500; k++){threadPoolExecutor.execute(threadLocalMultiThread.new TestWorker());}countDownLatch.await();}class TestWorker implements Runnable{@Overridepublic void run() {try {String s = UUID.randomUUID().toString();System.out.println(System.currentTimeMillis() + " " + Thread.currentThread().getName() + " producer : " + s);threadLocal.set(s);TimeUnit.SECONDS.sleep(1);System.out.println(System.currentTimeMillis() + " " + Thread.currentThread().getName() + "consumer : " + threadLocal.get());threadLocal.remove();} catch (InterruptedException e) {e.printStackTrace();}}}static int i = 0;static class MyThreadFactory implements ThreadFactory{@Overridepublic Thread newThread(Runnable r) {return new Thread(r, "my thread-" + i++);}}}輸出結果:
結論
最終可以發現在用一個線程中生產和消費他們的UUID始終是一致的,因而可以通過測試案例證明他們是線程安全的,可以放心使用啦
總結
以上是生活随笔為你收集整理的多线程场景下利用ThreadLocal是线程安全?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sizeof与offsetof有关的结构
- 下一篇: JSON.stringify() 方法