为什么我的代码在没有使用同步的情况下完美运行..?

Was*_*leh 0 java windows cpu multithreading synchronization

我在操作系统中遇到了与我的代码行为混淆的问题.现在你们都有很多方法可以为多线程进行同步,以便无论如何都能获得正确的值!

为什么我总是得到正确的价值而不使用同步的方式??? !

例如,查看下面的代码

在常规行为中,下面的程序应该在几秒后终止..因为有十个线程访问同一个变量并将其递增一个......并且在某些情况下应该导致计数值不是100000 ...这将停止循环..我在20分钟内运行此代码..它完美地工作..

任何人都可以告诉我发生了什么:D ??

我的操作系统是Windows 7,我正在使用eclipse Kepler .. JVM是8 ..而我的CPU不是双核......它是一个常规的独奏......有2.4 GHZ ......

public class Worker {
    int count;

    public static void main(String[] args) {
        new Worker().run();
    }

    public void run() {
        do {
            count = 0;
            Thread thread1 = new Thread(new Runnable() {
                public void run() {
                    for (int i = 0; i < 10000; i++) {
                        count++;
                    }
                }
            });

            Thread thread2 = new Thread(new Runnable() {
                public void run() {
                    for (int i = 0; i < 10000; i++) {
                        count++;
                    }
                }
            });

            Thread thread3 = new Thread(new Runnable() {
                public void run() {
                    for (int i = 0; i < 10000; i++) {
                        count++;
                    }
                }
            });

            Thread thread4 = new Thread(new Runnable() {
                public void run() {
                    for (int i = 0; i < 10000; i++) {
                        count++;
                    }
                }
            });

            Thread thread5 = new Thread(new Runnable() {
                public void run() {
                    for (int i = 0; i < 10000; i++) {
                        count++;
                    }
                }
            });

            Thread thread6 = new Thread(new Runnable() {
                public void run() {
                    for (int i = 0; i < 10000; i++) {
                        count++;
                    }
                }
            });

            Thread thread7 = new Thread(new Runnable() {
                public void run() {
                    for (int i = 0; i < 10000; i++) {
                        count++;
                    }
                }
            });

            Thread thread8 = new Thread(new Runnable() {
                public void run() {
                    for (int i = 0; i < 10000; i++) {
                        count++;
                    }
                }
            });

            Thread thread9 = new Thread(new Runnable() {
                public void run() {
                    for (int i = 0; i < 10000; i++) {
                        count++;
                    }
                }
            });

            Thread thread10 = new Thread(new Runnable() {
                public void run() {
                    for (int i = 0; i < 10000; i++) {
                        count++;
                    }
                }
            });

            thread1.start();
            thread2.start();
            thread3.start();
            thread4.start();
            thread5.start();
            thread6.start();
            thread7.start();
            thread8.start();
            thread9.start();
            thread10.start();

            try {
                thread1.join();
                thread2.join();
                thread3.join();
                thread4.join();
                thread5.join();
                thread6.join();
                thread7.join();
                thread8.join();
                thread9.join();
                thread10.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("Count is: " + count);
        } while (count == 100000);
    }
 }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

我怀疑你的JVM发生已经生成的代码,其中count++ JIT编译成一个原子操作...即使它没有保证对......和您的计算机的内存模型并不像松懈,因为它可以.

它仍然是不安全的 - 只是你碰巧在你的架构上侥幸逃脱.