详述ThreadLocal

代码:(第一种)

package keeper;

import java.util.Date;
import java.util.Random;

public class Test {
	private static int data = 0;
	public static void main(String[] args) {
		new Thread(new Runnable(){
			@Override
			public void run() {
				data = new Random().nextInt();
				System.out.println(Thread.currentThread().getName()+"has put data:"+data);
				new A().get();
				new B().get();
			}
		}).start();
	}
	static class A{
		public void get() {
			System.out.println("A from"+Thread.currentThread().getName()+"has get data:"+data);
		}
	}
	static class B{
		public void get() {
			System.out.println("B from"+Thread.currentThread().getName()+"has get data:"+data);
		}
	}
}

运行结果:

看到结果:很明显Thread-0的值并没有赋进去

解决办法:(第二种)

package keeper;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class Test {
	private static Map<Thread,Integer> threadData = new HashMap<Thread,Integer>();
	public static void main(String[] args) {
		for(int i = 1;i<=3;i++) {
			new Thread(new Runnable(){
				@Override
				public void run() {
				    int	data = new Random().nextInt();
					System.out.println(Thread.currentThread().getName()+"has put data:"+data);
					threadData.put(Thread.currentThread(), data);
					new A().get();
					new B().get();
				}
			}).start();
		}
	}
	static class A{
		public void get() {
			int data = threadData.get(Thread.currentThread());
			System.out.println("A from"+Thread.currentThread().getName()+"has get data:"+data);
		}
	}
	static class B{
		public void get() {
			int data = threadData.get(Thread.currentThread());
			System.out.println("B from"+Thread.currentThread().getName()+"has get data:"+data);
		}
	}
}

运行结果:

第二种方法确定:需要手动移除不需要的数据,否则新线程不断向map集合添加数据,最终导致内存溢出。(线程不安全)

 

第三种方法:

package keeper;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class Test {
    static ThreadLocal<Integer> x = new ThreadLocal<Integer>();	
	public static void main(String[] args) {
		for(int i = 1;i<=3;i++) {
			new Thread(new Runnable(){
				@Override
				public void run() {
				    int	data = new Random().nextInt();
					System.out.println(Thread.currentThread().getName()+"has put data:"+data);
					x.set(data);
					new A().get();
					new B().get();
				}
			}).start();
		}
	}
	static class A{
		public void get() {
			int data = x.get();
			System.out.println("A from"+Thread.currentThread().getName()+"has get data:"+data);
		}
	}
	static class B{
		public void get() {
			int data = x.get();
			System.out.println("B from"+Thread.currentThread().getName()+"has get data:"+data);
		}
	}
}

运行成功:

数据跟着线程走。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章