i am facing something confusion with my code behavior in my operation system .. You all now that there is a lot of ways to make a synchronization for multi-threading in order to get the right value no matter what !
so how come I am always get the right value Without using the a synchronized way ??? !!!
for example look into the below code
In regular behavior the below Program should terminated after a few second .. as there are ten threads accessing the very same variable and increment it by one .. and that should lead to have a value of count other than 100000 in some cases .. and that will stop the loop .. I am running this code over 20 Minutes .. and it worked perfectly ..
can anyone tell me what is going on :D ??
my operation system is windows 7 and I am using eclipse Kepler .. the JVM is 8 .. and my CPU is not Dual Core .. it's a regular solo .. with 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);
    }
 }
 
  
                     
                        
I suspect your JVM happens to have generated code where count++ is JIT-compiled into an atomic operation... even though it's not guaranteed to... and your computer's memory model isn't as lax as it could be.
It's still unsafe - it's just that you happen to be getting away with it on your architecture.
 
                    See more on this question at Stackoverflow