java多线程变量共享ThreadLoacl

     ThreadLocal一般称为线程本地变量,它是一种特殊的线程绑定机制,将变量与线程绑定在一起,为每一个线程维护一个独立的变量副本。通过ThreadLocal可以将对象的可见范围限制在同一个线程内。ThreadLocal为解决多线程程序的并发问题提供了一种新的思路ThreadLocal的目的是为了解决多线程访问资源时的共享问题.ThreadLocal不是一个线程而是一个线程的本地化对象。当工作于多线程环境中的对象采用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程分配一个独立的副本。每个线程都可以独立的改变自己的副本,而不影响其他线程的副本。

测试案例:

public class ThreadData {

	private static int data;
	
	public static void main(String[] args) {
        
		//创建两个线程修改变量
		for (int i = 0; i < 2; i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					data = new Random().nextInt(50)+100;
					System.out.println("ThreadData---------data=" +data);
					new AccountA().getData();
					new AccountB().getData();
				}
			}).start();
		}
	}


	static class AccountA {
		public void getData() {
			System.out.println("AccountA---->" + Thread.currentThread().getName() + "-----data=" + data);
		}
	}

	static class AccountB {
		public void getData() {
			System.out.println("AccountB---->" + Thread.currentThread().getName() + "-----data=" + data);
		}
	}
}

ThreadData---------data=147
ThreadData---------data=147
AccountA---->Thread-0-----data=147
AccountA---->Thread-1-----data=147
AccountB---->Thread-0-----data=147
AccountB---->Thread-1-----data=147

通过了控制台打印可以知道,数据公用变量出现混乱,所以解决此类问题TheadLocal便横空出世,通过map的方式保存当前线程的变量值

public class ThreadData {

	private static int data;
	
	private  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() {
					data = new Random().nextInt(50)+100;
					threadLocal.set(data);
					System.out.println("ThreadData---------data=" +threadLocal.get());
					new AccountA().getData();
					new AccountB().getData();
				}
			}).start();
		}
	}


	static class AccountA {
		public void getData() {
			System.out.println("AccountA---->" + Thread.currentThread().getName() + "-----data=" + threadLocal.get());
		}
	}

	static class AccountB {
		public void getData() {
			System.out.println("AccountB---->" + Thread.currentThread().getName() + "-----data=" + threadLocal.get());
		}
	}
}

ThreadData---------data=114
ThreadData---------data=132
AccountA---->Thread-1-----data=114
AccountA---->Thread-0-----data=132
AccountB---->Thread-1-----data=114
AccountB---->Thread-0-----data=132
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值