Ofe*_*Ron 1 java multithreading
这个主要给予ExecutorService 1000 runnables(测试者)所有他们所做的就是睡10毫秒,然后将1添加到静态计数器,主要假设等待直到所有执行完成,但是计数器达到了970左右执行......为什么?
public class Testit {
public static void main (String arg[]) {
int n=1000;
ExecutorService e1 = Executors.newFixedThreadPool(20);
for (int i=0 ;i <n ;i++) {
e1.execute(new Tester());
}
e1.shutdown();
try {
e1.awaitTermination(1, TimeUnit.DAYS);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Executed "+Tester.tester()+" Tasks.");
}
}
Run Code Online (Sandbox Code Playgroud)
和测试者类:
public class Tester implements Runnable {
public static long tester=0;
@Override
public void run() {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
finally { tester++; }
}
public static long tester() {
long temp=tester;
tester=0;
return temp;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
问题解决了:
finally { synchronized (lock) {tester++;} }
Run Code Online (Sandbox Code Playgroud)
谢谢JB Nizet!
因为你没有同步对计数器的访问,并且因为写long不是原子的,++也不是原子,所以两个并发计数器的并发线程可能导致完全不一致的结果,或者只导致一个增量而不是2.
AtomicLong改为使用,并incrementAndGet()对此进行调用AtomicLong.
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |