[英]Why isn't my synchronized method working?
簡而言之,我正在嘗試使用同步關鍵字而不是在完全沒有鎖的線程上運行函數時的區別。
在此代碼中:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.IntStream;
public class mainClass {
static int count=0;
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(2);
Runnable r =new Runnable() {
public synchronized void run() {
count = count + 1;
}
};
IntStream.range(0, 10000)
.forEach(i -> executor.submit(r::run));
executor.shutdown();
System.out.println(count); // 10000
}
}
如我所料,它無法正常工作,它在40%的運行中返回10000。 這是為什么? 問題出在哪兒? 我以為函數運行一次只能由1個線程運行,因此應該沒有問題,但顯然我錯了。
ExecutorService#shutdown
不等待任務完成。 您應該awaitTermination
使用awaitTermination
。
請參閱ExecutorService#shutdown的文檔 。
IntStream.range(0, 10000)
.forEach(i -> executor.submit(r::run));
executor.shutdown();
executor.awaitTermination(1, TimeUnit.MINUTE); // <!-- HERE
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.