您的位置:首页 > 其它

优雅的设计单线程范围内的数据共享(ThreadLocal)

2015-12-13 09:26 363 查看
单线程范围内数据共享使用ThreadLocal

/**
* @Description    TODO
* @author         zhanghw@chinatelecom.cn
* @since          2015年12月12日
* @version        V1.0
*/

public class DataShare {
/**
* ThreadLocal:保存和当前线程相关的变量数据
* 线程范围内的数据共享 ThreadLocal
* 优雅的设计方式,Person
* 每一个线程使用完毕要清空ThreadLocal保存的当前变量
*
* 如何判断一个线程结果:监听器,回调函数
* 当一个线程结束的时候,主动调用回调函数表示函数结束。
* 怎么得到线程结束的通知 :ThreadDeathEvent
* 在虚拟机结束的时候发邮件
*
* ThreadDeatRequest
* com.sun.jdi.request //sun公司给开发虚拟机用的,不对普通开发人员开放
*
*/

public static void main(String[] args) {

new Thread(new Runnable() {
@Override
public void run() {
Person.getInstance().setName("zhangsan");
Person.getInstance().setAge(25);
new A().getName();
new B().getName();

}
}).start();

new Thread(new Runnable() {
@Override
public void run() {
Person.getInstance().setName("lisi");
Person.getInstance().setAge(28);
new A().getName();
new B().getName();

}
}).start();
}

}

class A{
public void getName(){
System.out.println("A "+Thread.currentThread().getName()+":"+Person.getInstance().getName());
}
}
class B {
public void getName(){
System.out.println("B "+Thread.currentThread().getName()+":"+Person.getInstance().getName());
}
}


Person类(优雅的线程范围共享数据设计):

package com.ctyun.thread.datashare;

/**
* @Description TODO
* @author zhanghw@chinatelecom.cn
* @since 2015年12月12日
* @version V1.0
*/

public class Person {
// 优雅的设计方式,将ThreadLocal封装到bean内部,隐藏变化
private static ThreadLocal<Person> instance = new ThreadLocal<Person>();

private Person() {
}

public static Person getInstance() {
Person p = instance.get();
if (p == null) {
p = new Person();
instance.set(p);
}

return p;
}

private String name;
private int age;

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;
}

}


ThreaLocal的remove方法,可以移除当前线程绑定在ThreadLocal上的所有变量数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: