zoukankan      html  css  js  c++  java
  • Java ThreadLocal Example(java中的ThreadLocal例子)

    Java ThreadLocal is used to create thread local variables. We know that all threads of an Object share it’s variables, so the variable is not thread safe. We can use synchronization for thread safety but if we want to avoid synchronization, we can use ThreadLocal variables.

    Java ThreadLocal

    ThreadLocal, Java ThreadLocal

    Every thread has it’s own ThreadLocal variable and they can use it’s get() and set() methods to get the default value or change it’s value local to Thread.

    ThreadLocal instances are typically private static fields in classes that wish to associate state with a thread.

    Java ThreadLocal Example

    Here is a small example showing use of ThreadLocal in java program and proving that every thread has it’s own copy of ThreadLocal variable.

    ThreadLocalExample.java

    Copy
    package com.journaldev.threads; import java.text.SimpleDateFormat; import java.util.Random; public class ThreadLocalExample implements Runnable{ // SimpleDateFormat is not thread-safe, so give one to each thread private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>(){ @Override 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 pattern is changed here by thread, but it won't reflect to other threads formatter.set(new SimpleDateFormat()); System.out.println("Thread Name= "+Thread.currentThread().getName()+" formatter = "+formatter.get().toPattern()); } }

    Output of the above java ThreadLocal example program is:

    
    Thread Name= 0 default Formatter = yyyyMMdd HHmm
    Thread Name= 1 default Formatter = yyyyMMdd HHmm
    Thread Name= 0 formatter = M/d/yy h:mm a
    Thread Name= 2 default Formatter = yyyyMMdd HHmm
    Thread Name= 1 formatter = M/d/yy h:mm a
    Thread Name= 3 default Formatter = yyyyMMdd HHmm
    Thread Name= 4 default Formatter = yyyyMMdd HHmm
    Thread Name= 4 formatter = M/d/yy h:mm a
    Thread Name= 5 default Formatter = yyyyMMdd HHmm
    Thread Name= 2 formatter = M/d/yy h:mm a
    Thread Name= 3 formatter = M/d/yy h:mm a
    Thread Name= 6 default Formatter = yyyyMMdd HHmm
    Thread Name= 5 formatter = M/d/yy h:mm a
    Thread Name= 6 formatter = M/d/yy h:mm a
    Thread Name= 7 default Formatter = yyyyMMdd HHmm
    Thread Name= 8 default Formatter = yyyyMMdd HHmm
    Thread Name= 8 formatter = M/d/yy h:mm a
    Thread Name= 7 formatter = M/d/yy h:mm a
    Thread Name= 9 default Formatter = yyyyMMdd HHmm
    Thread Name= 9 formatter = M/d/yy h:mm a
    

    As you can see from the output that Thread-0 has changed the value of formatter but still thread-2 default formatter is same as the initialized value. You can see the same pattern for other threads too.

    Update: ThreadLocal class is extend in Java 8 with a new method withInitial() that takes Supplier functional interface as argument. So we can use lambda expressions to easily create the ThreadLocal instance. For example, above formatter ThreadLocal variable can be defined in one line as below:

    
    private static final ThreadLocal<SimpleDateFormat> formatter = 
    	ThreadLocal.<SimpleDateFormat>withInitial
    	(() -> {return new SimpleDateFormat("yyyyMMdd HHmm");});
    

    If you are new to Java 8 features, please check out Java 8 Features and Java 8 Functional Interfaces.

    That’s all for ThreadLocal in java programming.

    Reference: API Doc

  • 相关阅读:
    英语词汇——day 1
    英语词汇——day 2
    PHP的流程控制语句(上)
    思维导图——四级词汇1
    PHP语句块中使用date()函数时需注意wampserver的设置
    (转)Linux服务器调优
    (转)linux服务器安全配置攻略
    mysql 创建[序列],功能类似于oracle的序列
    计算服务器最大并发量http协议请求以webSphere服务器为例考虑线程池
    Spring中ApplicationContextAware接口的说明
  • 原文地址:https://www.cnblogs.com/jpfss/p/9373185.html
Copyright © 2011-2022 走看看