转:ThreadLocal实现线程范围内的数据共享

实现线程范围内的数据共享就是各自的线程管理各自线程上的数据,不被另外线程干扰。大个比方: 当第一个线程运行的时候往一集合里放一数据(比如是2),当第二个线程运行过来的时候往相同的集合里相同的位置上放了数据3,这时通常情况下是3将2覆盖掉了,然而在这里不是这样的,他们是两个不同的线程,不能有冲突,这要怎么解决呢? 有两种办法,使的当第一个线程再次运行都这里时,取出数据是2,当第二个线程也再次运行到这里时候取出数据是3, 这样取出的数据是刚开始放入的数据,没有产生冲突。

第一种方法:

使用Map

package cn.itcast.thread;

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

public class ThreadLocalShare {

	/**
	 * @param args
	 */
	//private static int data;
	private static Map shareData = new HashMap();
	public static void main(String[] args) {

		for (int i=0; i<2; i++) {
			new Thread(){
				public void run() {
					int data = new Random().nextInt();
					shareData.put(Thread.currentThread(), data);
					System.out.println(Thread.currentThread().getName() + " put data is " + data);
					System.out.println(Thread.currentThread().getName() + " A get data is " + new A().get());
					System.out.println(Thread.currentThread().getName() + " B get data is " + new B().get());
				}
			}.start();
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	

	static class A {
		public  int get() {
			synchronized (ThreadLocalShare.class) {
				try {
					Thread.sleep(new Random().nextInt(100));
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				return (Integer)shareData.get(Thread.currentThread());
			}
		}
	}

	static class B {
		public  int get() {
			synchronized (ThreadLocalShare.class) {
				try {
					Thread.sleep(new Random().nextInt(100));
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				return (Integer)shareData.get(Thread.currentThread());
			}
		}
	}
	
}

 

第二种方法:

使用ThreadLocal类

 

package cn.itcast.thread;

import java.util.Random;

import cn.itcast.thread.ThreadLocalShare.A;
import cn.itcast.thread.ThreadLocalShare.B;

public class ThreadLocalShare2 {

	private static ThreadLocal shareData = new ThreadLocal();
	
	public static void main(String[] args) {
		for (int i=0; i<2; i++) {
			new Thread(){
				public void run() {
					int data = new Random().nextInt();
					//shareData.set(data);
					MyData.getInstance().setData(data);
					System.out.println(Thread.currentThread().getName() + " put data is " + data);
					System.out.println(Thread.currentThread().getName() + " A get data is " + new A().get());
					System.out.println(Thread.currentThread().getName() + " B get data is " + new B().get());
					System.out.println(Thread.currentThread().getName() + " C get data is " + new C().get());
				}
			}.start();
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	static class A {
		public  int get() {
			synchronized (ThreadLocalShare.class) {
				try {
					Thread.sleep(new Random().nextInt(100));
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				return MyData.getInstance().getData();
			}
		}
	}

	static class B {
		public  int get() {
			synchronized (ThreadLocalShare.class) {
				try {
					Thread.sleep(new Random().nextInt(100));
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				return MyData.getInstance().getData();
			}
		}
	}
	
	static class C {
		public  int get() {
			synchronized (ThreadLocalShare.class) {
				try {
					Thread.sleep(new Random().nextInt(100));
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				return MyData.getInstance().getData();
			}
		}
	}
}

class MyData {
	private static ThreadLocal instanceHolder = new ThreadLocal();
	
	private int data;
	private static MyData instance = new MyData();
	
	private MyData() {}
	
	public static MyData getInstance() {
		MyData instance = (MyData) instanceHolder.get();
		if (instance == null) {
			instance = new MyData();
			instanceHolder.set(instance);
		}
		return instance;
	}
	
	public void setData(int data) {
		this.data = data;
	}
	
	public int getData() {
		return data;
	}

}

 

猜你喜欢

转载自stunizhengjia.iteye.com/blog/2246119