詳述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);
		}
	}
}

運行成功:

數據跟着線程走。

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