Thread Local

Java ThreadLocal 举例

Java ThreadLocal 被用来创建线程局部变量。

Object的所有线程都共享它的变量,因此变量不是线程安全的。

我们可以通过同步来实现线程安全

这里提供另一个方法,ThreadLocal

Java ThreadLocal

每个线程都有自己的ThreadLocal变量,可以使用 get() 和 set() 方法来获取默认值或将其值更改为本地的Thread值

ThreadLocal实例通常将状态与线程相关联的类中的私有静态字段。

package coreofjava.javathread.threadlocal;

import java.text.SimpleDateFormat;
import java.util.Random;

public class ThreadLocalExample implements Runnable {
    private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>(){
        protected SimpleDateFormat initialValue() {
            return new SimpleDateFormat("yyyyMMdd HHmm");
        }
    };

    public static void main(String[] args) throws InterruptedException {
        ThreadLocalExample obj = new ThreadLocalExample();
        for (int i = 0; i < 10; i++) {
            Thread t = new Thread(obj, "" + i);
            Thread.sleep(new Random().nextInt(1000));
            t.start();
        }
    }

    @Override
    public void run() {
        System.out.println("Thread Name = " + Thread.currentThread().getName() + " default Formatter = " + formatter.get().toPattern());
        try {
            Thread.sleep(new Random().nextInt(1000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        formatter.set(new SimpleDateFormat());

        System.out.println("Thread Name = " + Thread.currentThread().getName() + " formatter = " + formatter.get().toPattern());
    }
}

运行结果

Thread Name = 0 default Formatter = yyyyMMdd HHmm
Thread Name = 1 default Formatter = yyyyMMdd HHmm
Thread Name = 1 formatter = yy-M-d ah:mm
Thread Name = 2 default Formatter = yyyyMMdd HHmm
Thread Name = 0 formatter = yy-M-d ah:mm
Thread Name = 3 default Formatter = yyyyMMdd HHmm
Thread Name = 3 formatter = yy-M-d ah:mm
Thread Name = 2 formatter = yy-M-d ah:mm
Thread Name = 4 default Formatter = yyyyMMdd HHmm
Thread Name = 4 formatter = yy-M-d ah:mm
Thread Name = 5 default Formatter = yyyyMMdd HHmm
Thread Name = 5 formatter = yy-M-d ah:mm
Thread Name = 6 default Formatter = yyyyMMdd HHmm
Thread Name = 7 default Formatter = yyyyMMdd HHmm
Thread Name = 8 default Formatter = yyyyMMdd HHmm
Thread Name = 6 formatter = yy-M-d ah:mm
Thread Name = 7 formatter = yy-M-d ah:mm
Thread Name = 9 default Formatter = yyyyMMdd HHmm
Thread Name = 9 formatter = yy-M-d ah:mm
Thread Name = 8 formatter = yy-M-d ah:mm
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容