[quote]
1. 用Processor ,这个类有一个变量 localVal是 threadLocal 变量, 在两个thread作用下,会把这个变量在自己的线程内分别复制一份,这样不会有累计加一的情况发生, 只会把locaVal在两个方法内进行自己的加一动作 。
2. 用Processor2 , 这个类的变量localVal 是一个Integer类型的,而作为资源传入的Processor2对象, 因为没用使用threadLocal的方式, 所以这个变量被两个线程共享, 会被加两次。
[/quote]
1. 用Processor ,这个类有一个变量 localVal是 threadLocal 变量, 在两个thread作用下,会把这个变量在自己的线程内分别复制一份,这样不会有累计加一的情况发生, 只会把locaVal在两个方法内进行自己的加一动作 。
2. 用Processor2 , 这个类的变量localVal 是一个Integer类型的,而作为资源传入的Processor2对象, 因为没用使用threadLocal的方式, 所以这个变量被两个线程共享, 会被加两次。
[/quote]
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);
}
}