关于有效java 2 char 10第66项

关于有效java 2 char 10第66项,java,concurrency,Java,Concurrency,测试5次 代码A将导致 预计时间:23,休息时间:977 预计时间:45,休息时间:955 预计时间:174,中断时间:825 预计时间:207,中断时间:793 预计时间:175,中断时间:825 代码A while (!stopRequested) { j++; // System.out.println("brokenStopMultiThread " + copy + " " + j++); } 代码B将导致 预计时间:1000,中断时间:0 预计时间:999,中断时间

测试5次 代码A将导致 预计时间:23,休息时间:977 预计时间:45,休息时间:955 预计时间:174,中断时间:825 预计时间:207,中断时间:793 预计时间:175,中断时间:825

代码A

while (!stopRequested) {
    j++;
    // System.out.println("brokenStopMultiThread " + copy + " " + j++);
}
代码B将导致 预计时间:1000,中断时间:0 预计时间:999,中断时间:0 预计时间:1000,中断时间:0 预计时间:1000,中断时间:0 预计时间:1000,中断时间:0 代码B

while (!stopRequested) {
    try {
        TimeUnit.MILLISECONDS.sleep(10);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    j++;
//  System.out.println("brokenStopMultiThread " + copy + " " + j++);
}

所有线程都在不同的运行时停止,可能在jdk8上不容易发生活动性故障

系统中的某个地方隐藏了一个volatile
PrintWriter
?这个循环太紧;添加一个迷你睡眠模式here@ScaryWombat谢谢你,谢谢works@chrylisPrintStream#println(java.lang.String)有一个同步的代码块,但这不是reason@omottec为什么不是呢,因为每个线程中都有一个
println
while (!stopRequested) {
    try {
        TimeUnit.MILLISECONDS.sleep(10);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    j++;
//  System.out.println("brokenStopMultiThread " + copy + " " + j++);
}
while (!stopRequested) {
    /*try {
        TimeUnit.MILLISECONDS.sleep(10);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    j++;*/
    System.out.println("brokenStopMultiThread " + copy + " " + j++);
}