我已经尝试了内部锁和 java.util.concurrent.ReentrantLock 之间的差异一段时间了。我发现了非常奇怪的事情。考虑以下代码:
public class WriteOnceRunAnywhere {
private static long counter = 0;
public static void main(String[] args) throws InterruptedException {
final int numThreads = 2;
final int numIterations = Integer.MAX_VALUE;
Runnable inc = new Runnable() {
public void run() {
for (int i = 0; i < numIterations; i++) {
increment();
if (i % 10000000 == 0)
System.out.println(Thread.currentThread().getName());
}
}
};
for (int i = 0; i < numThreads; i++)
new Thread(inc).start();
}
public static synchronized void increment() {
counter++;
}
}
简单的事情,没有花哨的东西。正确的?偏偏就断了! 当你运行它时,它很可能不会结束。在线程之间进行一些乒乓之后,您会看到 实际上只有一个线程在运行。另一个永远挂起:
Thread-1 Thread-2 Thread-1 Thread-2 Thread-1 ... Thread-2 Thread-2 Thread-2 Thread-2 Thread-2 Thread-2 Thread-2 Thread-2 Thread-2 ...
此后,java进程无法接受jvisualvm
连接。 CPU负载下降并持续保持在1.0%左右。
Mac OS X Lion 10.7.2 (11C74), 2.53 GHz Intel Core i5
java version "1.6.0_29" Java(TM) SE Runtime Environment (build 1.6.0_29-b11-402-11M3527) Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02-402, mixed mode)
谁能告诉我这里到底发生了什么?
UPD 看起来该错误将在 1.6.30 see 中修复
最佳答案
看来您正在观察 Mac OS 7 JDK 1.6 中的现有错误。您可以看到这里发生了同样的问题:
http://cs.oswego.edu/pipermail/concurrency-interest/2012-January/008778.html
您可能想从头开始阅读
http://cs.oswego.edu/pipermail/concurrency-interest/2012-January/008759.html
Open JDK 7 似乎终于有了解决方案。
http://cs.oswego.edu/pipermail/concurrency-interest/2012-January/008789.html
长话短说。仅当 JDK 1.6_14(或更高版本 < JDK 7)和 Max OS 7 时才会失败。他们的测试和您看到的结果非常相似。
我猜你甚至无法获取 jstack 或加载 jconsole?
关于java - Java 6 Mac OS X Lion 上的奇怪并发行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9038169/