threadlocal 的例子 自己写的(2)

引用

1. 用Processor ,这个类有一个变量 localVal是 threadLocal 变量, 在两个thread作用下,会把这个变量在自己的线程内分别复制一份,这样不会有累计加一的情况发生, 只会把locaVal在两个方法内进行自己的加一动作 。

2. 用Processor2 , 这个类的变量localVal 是一个Integer类型的,而作为资源传入的Processor2对象, 因为没用使用threadLocal的方式, 所以这个变量被两个线程共享, 会被加两次。




package com.ssc.dbcttool.test;


public class PatternExec {
	
	public static void main(String[] args) {
		Exec onlyOne = new Processor();
		//Exec onlyOne = new Processor2();
		
		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();
		
	}
	
}







package com.ssc.dbcttool.test;

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




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());
	}
}



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/2363739