本地线程,一般用于防止对可变的单实例对象或全局变量进行共享,常见的好比数据库链接。能够将ThreadLocal<T>视为Map<Thread,T>,虽然实际上并非这样实现的。也能够把事务上下文保存在ThreadLocal中,虽然方便处理一些功能,可是隐性增长了耦合度,下降了代码的可重用性,所以尽可能避免滥用ThreadLocal。ThreadLocal提供了get和set经常使用的方法,set是用来设置值,get是用来获取set设置的最新的值。这些值相对于使用改变量的线程存有的一份独立的副本。java
public class NotSafeDemo2 { private ThreadLocal<Integer> num = new ThreadLocal<>(); public void add(int value) { try { if (null == num.get()) { num.set(0); } int temp = num.get(); num.set(num.get() + value); Thread.sleep(100); System.out.println(value + "+" + temp + "=" + num.get()); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { NotSafeDemo2 synchronizeDemo = new NotSafeDemo2(); AddThread3 addThread3 = new AddThread3(synchronizeDemo); AddThread4 addThread4 = new AddThread4(synchronizeDemo); addThread3.start(); addThread4.start(); } } class AddThread3 extends Thread { NotSafeDemo2 synchronizeDemo; public AddThread3(NotSafeDemo2 synchronizeDemo) { this.synchronizeDemo = synchronizeDemo; } @Override public void run() { synchronizeDemo.add(1); } } class AddThread4 extends Thread { NotSafeDemo2 synchronizeDemo; public AddThread4(NotSafeDemo2 synchronizeDemo) { this.synchronizeDemo = synchronizeDemo; } @Override public void run() { synchronizeDemo.add(2); } }
运行结果以下:
这里直接更改java并发编程学习之synchronize(一)的例子,能够看到,num的值不被线程共享。数据库