简介
如上图,Connection必须是线程访问内共享,否则事务提交将出现错乱。线程内共享的意思就是每个线程拥有独立的一份数据,相互不干扰,如上图每个线程拥有独立的Connection。总结起来就是:线程内共享,线程外独立。
示例1
public class A {
private ThreadLocal<Integer> tlInteger = null;
public A(ThreadLocal<Integer> tlInteger) {
this.tlInteger = tlInteger;
}
public void getTlInteger(){
System.out.println("A tread:"+Thread.currentThread().getName()+"--tlInteger:"+tlInteger.get());
}
}
public class B {
private ThreadLocal<Integer> tlInteger = null;
public B(ThreadLocal<Integer> tlInteger) {
this.tlInteger = tlInteger;
}
public void getTlInteger(){
System.out.println("B tread:"+Thread.currentThread().getName()+"--tlInteger:"+tlInteger.get());
}
}
import java.util.Random;
public class Main {
/**线程访问内共享变量*/
private static ThreadLocal<Integer> tlInteger = new ThreadLocal<Integer>();
public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(){
public void run() {
int data = new Random().nextInt();
System.out.println("thread:"+Thread.currentThread().getName()+"--data:"+data);
tlInteger.set(data);
new A(tlInteger).getTlInteger();
new B(tlInteger).getTlInteger();
};
}.start();
}
}
}
示例2
/**
* 线程共享本地类(需要线程共享多个字段时使用)
* @author liujun
*
*/
public class MyThreadLocalData {
private String name;
private int age;
private MyThreadLocalData(){}
/**线程共享本地变量*/
private static ThreadLocal<MyThreadLocalData> map = new ThreadLocal<MyThreadLocalData>();
/**
* 获取线程本地共享范围的单粒
* @return
*/
public static MyThreadLocalData getThreadData(){
MyThreadLocalData instance = map.get();
if (instance == null) {
instance = new MyThreadLocalData();
map.set(instance);
}
return instance;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class A {
private MyThreadLocalData data = null;
public A(MyThreadLocalData data) {
this.data = data;
}
public void getTlInteger(){
System.out.println("A tread:"+Thread.currentThread().getName()+"--name:"+
data.getName()+"--age:"+data.getAge());
}
}
public class B {
private MyThreadLocalData data = null;
public B(MyThreadLocalData data) {
this.data = data;
}
public void getTlInteger(){
System.out.println("B tread:"+Thread.currentThread().getName()+"--name:"+
data.getName()+"--age:"+data.getAge());
}
}
import java.util.Random;
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(){
public void run() {
int data = new Random().nextInt();
System.out.println("thread:"+Thread.currentThread().getName()+"--data:"+data);
MyThreadLocalData myData = MyThreadLocalData.getThreadData();
myData.setName("name"+data);
myData.setAge(data);
new A(myData).getTlInteger();
new B(myData).getTlInteger();
};
}.start();
}
}
}