引用
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); } }