从ThreadLocal的名字上能够看到,这是一个线程局部变量,也就是说,只有当前线程能够访问,既然是只有当前线程能够访问的数据,天然是线程安全的.
public class ThreadLocalDemo {
private static ThreadLocal<SimpleDateFormat> t1 = new ThreadLocal<>();
public static class ParseDate implements Runnable {
int i = 0;
public ParseDate(int i) {
this.i = i;
}
/**
* When an object implementing interface <code>Runnable</code> is used
* to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately executing
* thread.
* <p>
* The general contract of the method <code>run</code> is that it may
* take any action whatsoever.
*
* @see Thread#run()
*/
@Override
public void run() {
try {
if (t1.get() == null)
t1.set(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
Date t = t1.get().parse("2015-03-29 19:29:" + i % 60);
System.out.println(i + ":" + t);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ExecutorService es = Executors.newFixedThreadPool(10);
for (int i = 0; i < 1000; i++) {
es.execute(new ParseDate(i));
}
}
}
从这里也能够看到,为每个线程人手分配一个对象工做并非有ThreadLocal来完成的.而是须要在应用层面保证的,若是在应用上为每个线程分配了相同的对象实例,那么ThreadLocal也不能保证线程安全,