标签:
概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。
模拟ThreadLocal
import java.util.Collections;import java.util.HashMap;import java.util.Map;public class SimpleThreadLocal<T> {private Map<Thread, T> valueMap = Collections.synchronizedMap(new HashMap<Thread, T>());public void set(T newValue) {valueMap.put(Thread.currentThread(), newValue); // ①键为线程对象,值为本线程的变量副本}public T get() {Thread currentThread = Thread.currentThread();T o = valueMap.get(currentThread); // ②返回本线程对应的变量if (o == null && !valueMap.containsKey(currentThread)) { // ③如果在Map中不存在,放到Map中保存起来。o = initialValue();valueMap.put(currentThread, o);}return o;}public void remove() {valueMap.remove(Thread.currentThread());}protected T initialValue() {return null;}}
class Count {private SimpleThreadLocal<Integer> count = new SimpleThreadLocal<Integer>() {@Overrideprotected Integer initialValue() {return 0;}};public Integer increase() {count.set(count.get() + 1);return count.get();}}class TestThread implements Runnable {private Count count;public TestThread(Count count) {this.count = count;}@Overridepublic void run() {// TODO Auto-generated method stubfor (int i = 1; i <= 3; i++) {System.out.println(Thread.currentThread().getName() + "\t" + i+ "th\t" + count.increase());}}}public class TestThreadLocal {public static void main(String[] args) {Count count = new Count();Thread t1 = new Thread(new TestThread(count));Thread t2 = new Thread(new TestThread(count));Thread t3 = new Thread(new TestThread(count));Thread t4 = new Thread(new TestThread(count));t1.start();t2.start();t3.start();t4.start();}}
标签:
原文地址:http://www.cnblogs.com/csu_xajy/p/4342724.html