threadlocal 的例子 自己写的

引用

thread local variable 就是这么拉风,在多线程的情况下, 把一个公用的类可以共享而没有多线程的问题




先写一个接口
package com.ssc.dbcttool.test;

public interface Exec {
	public Exec firstActionToPrepare();
	
	public void secondAction();
}



再写一个客户端
package com.ssc.dbcttool.test;


public class PatternExec {
	
	public static void main(String[] args) {
		
		Exec onlyOne = new Processor();  体现出本例需要的threadlocal的风采
		//Exec onlyOne = new Processor1();  low 逼 同意变量被反复自增的现象

		Thread t1 = new DoThingThread(onlyOne);
		Thread t2 = new DoThingThread(onlyOne);
			
		t1.start();
		t2.start();
		
	}

	
	
}

这个线程里用的都是接口 这个在后面使用的时候很方法, 客户端修改测试,只需要改具体实现类就可以
class DoThingThread extends Thread{
	
	private Exec only;
	
	public DoThingThread(Exec onlyOne){
		only = onlyOne;
	}
	
	@Override
	public void run() {
		
		only.firstActionToPrepare().secondAction();
		
	}
	
}



第一个使用 线程内部变量的processor  , 在客户端被两个线程各调用一次的时候, 不会有累加的情况发生, 打印出来时 localVal的值始终就是1

package com.ssc.dbcttool.test;

public class Processor implements Exec{
	
	private ThreadLocal<Integer> localVal = new ThreadLocal<Integer>();
	
	
	public Exec firstActionToPrepare(){
		if(localVal.get()!=null){
			Integer oldVal = localVal.get();
			localVal.set(Integer.valueOf(oldVal.intValue() + 1));
		}else{
			localVal.set(Integer.valueOf(1));
		}
		
		return this;
	}
	
	public void secondAction(){
		System.out.println(localVal.get());
	}
}



第二个类使用了 一个变量, 传入两个线程, 线程赋值的速度很快,并且使用实际上同一个变量,最终结果是 val 变成 2了
package com.ssc.dbcttool.test;

public class Processor2 implements Exec{
	
	private Integer localVal = new Integer(0);
	
	
	public Exec firstActionToPrepare(){
		
		localVal++;
		
		return this;
	}
	
	public void secondAction(){
		System.out.println(localVal);
	}
}


猜你喜欢

转载自dannyhz.iteye.com/blog/2321829