您的位置:首页 > 其它

4、线程范围内的数据共享之ThreadLocal

2015-09-03 21:24 531 查看
/**
* 线程范围类的数据共享
* 核心:ThreadLocal类
* 实际场景:
* Hibernate的getCurrentSession方法,就是从线程范围内获取存在的session,如果不存在则新建一个并绑定到线程上
* struts将一个请求里的所有参数绑定到一个线程范围内的对象里
* @author yzl
*
*/
public class ThreadPart_4 {
public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
MyThreadLocalObj obj = MyThreadLocalObj.getInstance();
while(obj.getData()<20){
obj.add();
System.out.println(Thread.currentThread().getName() + " after add method value :" + obj.getData());
//这里操作其实就是同一个MyThreadLocalObj对象
new MyAdd().add();
System.out.println(Thread.currentThread().getName() + " after MyAdd add method value :" + obj.getData());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();

new Thread(new Runnable() {
public void run() {
MyThreadLocalObj obj = MyThreadLocalObj.getInstance();
while(obj.getData()>0){
obj.sub();
System.out.println(Thread.currentThread().getName() + " after sub method value :" + obj.getData());
//这里操作其实就是同一个MyThreadLocalObj对象
new MySub().sub();
System.out.println(Thread.currentThread().getName() + " after MySub sub method value :" + obj.getData());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}

class MyAdd{
public void add(){
MyThreadLocalObj.getInstance().add();
}
}

class MySub{
public void sub(){
MyThreadLocalObj.getInstance().sub();
}
}

/**
* 单例模式下的
* 线程范围内共享
* 线程范围外互不影响
* @author yzl
*
*/
class MyThreadLocalObj{
private int data = 10;

public void add(){
data++;
}

public void sub(){
data--;
}

private MyThreadLocalObj(){};
private static ThreadLocal<MyThreadLocalObj> local = new ThreadLocal<MyThreadLocalObj>();

public static MyThreadLocalObj getInstance(){
if(local.get() == null){
local.set(new MyThreadLocalObj());
}
return local.get();
}

public int getData() {
return data;
}
}


运行结果:

不同线程操作的对象不是同一个,同一个线程操作的是同一个

1 Thread-0 after add method value :11
2 Thread-1 after sub method value :9
3 Thread-0 after MyAdd add method value :12
4 Thread-1 after MySub sub method value :8
Thread-1 after sub method value :7
Thread-0 after add method value :13
Thread-1 after MySub sub method value :6
Thread-0 after MyAdd add method value :14
Thread-1 after sub method value :5
Thread-0 after add method value :15
Thread-1 after MySub sub method value :4
Thread-0 after MyAdd add method value :16
Thread-0 after add method value :17
Thread-1 after sub method value :3
Thread-0 after MyAdd add method value :18
Thread-1 after MySub sub method value :2
Thread-0 after add method value :19
Thread-0 after MyAdd add method value :20
Thread-1 after sub method value :1
Thread-1 after MySub sub method value :0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: