java - Java 6 Mac OS X Lion 上的奇怪并发行为

标签 java multithreading macos osx-lion synchronized

我已经尝试了内部锁和 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/

相关文章:

java - 浏览器发送 OPTIONS 而不是 PUT 或 DELETE

java - 如何在纯Java(非Android)中订阅和接收Firebase消息

java - jython多线程

macos - NSTableView 上不存在的多个单元格

swift - Xcode 单选按钮在单击后不会切换到关闭状态

java - Android-按钮滑动效果

java - 找不到 Gradle DSL 方法 : exclude()

java.net.SocketException : sendto failed: EPIPE (Broken pipe) When sending character to check socket connection

python - 我想停止 python 中的平方函数线程,但它不起作用?

c++ - 相对路径在 Xcode C++ 中不起作用