import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class CachedThreadPool {
private static int id = 0;
public static void main(String[] args) {
new CachedThreadPool().fun();
}
private void fun() {
ExecutorService exe = Executors.newCachedThreadPool();
ArrayList<Future<String>> list = new ArrayList<Future<String>>();
for (int i=0;i<3;i++) {
list.add(exe.submit(new TaskCall()));
}
for (Future<String> fs : list) {
try {
System.out.println(fs.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
exe.shutdown();
}
private synchronized String getId() {
return ++id + "";
}
class TaskCall implements Callable<String> {
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
return getId();
}
}
}
这段代码并没有什么问题,但是为何把getId()函数放到TaskCall内部,却会得到同步失败的输出(2 2 3或者3 3 3等),这是为什么呢?
因为放到TaskCall里之后,synchronized表示在一个TaskCall实例上同步执行。有3个实例,它们之间是不同步的。
而放在外面是在一个CachedThreadPool中同步。