多线程编程1-----ThreadLocal

package zhu;
/*
 * 要求:
 * 利用Thread的局部变量类ThreadLocal 封装数据
 * 然后再赋值数据 实现一个线程有多分相同的变量,而且各线程之间的变量值互不影响
 * 官方应用场景:
 * 在Java的多线程编程中,为保证多个线程对共享变量的安全访问,通常会使用synchronized来保证同一时刻只有一个线程对共享变量进行操作。
 * 这种情况下可以将类变量放到ThreadLocal类型的对象中,使变量在每个线程中都有独立拷贝,
 * 不会出现一个线程读取变量时而被另一个线程修改的现象。
 * 
 * */
import java.util.Random;
public class ThreadLocalTest {


// static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>();//改用对象封装数据
public static void main(String[] args) {
for( int i=0;i<2;i++ )
new Thread(
new Runnable() {
@Override
public void run() {
int data = new Random().nextInt();
//向ThreadLocal对象中放入数据 但是隐含了当前线程
MyThreadLocalData.getInstance().setName(""+data);
System.out.println(Thread.currentThread().getName()+" get data:"+data);
new A().getData();//这里获取当前线程共享的数据
new B().getData();
}
}
).start();
}
static class A{
void getData(){
System.out.println("A from"+Thread.currentThread().getName()
+",name:"+MyThreadLocalData.getInstance().getName());
}
}
static class B{
void getData(){
System.out.println("B from"+Thread.currentThread().getName()+",name:"+MyThreadLocalData.getInstance().getName());
}
}
}
/**
 * ThreadLocal的原理
在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。比如下面的示例实现:
 * @author nn
 *
 */
class MyThreadLocalData{
private static MyThreadLocalData myThreadLocalData=null;
//单利模式 饿式
public static MyThreadLocalData getInstance(){
//先从存储数据工具类中取 是否存在数据 因为把线程独享数据封装到对象中
myThreadLocalData = map.get();//由于从“map”对象中取是否存在独享数据,所以不必加锁
if(myThreadLocalData==null){
myThreadLocalData = new MyThreadLocalData();
//新建数据对象 则存入数据工具中
map.set(myThreadLocalData);
}
return myThreadLocalData;
}
private static ThreadLocal<MyThreadLocalData> map = new ThreadLocal<>();//创建存储当前线程的数据
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值