public class ThreadsDemo {
    public static int n = 0;
    private static final int NTHREADS = 300;
    public static void main(String[] argv) throws InterruptedException {
        final CountDownLatch cdl = new CountDownLatch(NTHREADS);
        for (int i = 0; i < NTHREADS; i++) {
            new Thread(new Runnable() {
                public void run() {
//                    try {
//                        Thread.sleep(10);
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
                    n += 1;
                    cdl.countDown();
                }
            }).start();
        }
        cdl.await();
        System.out.println("fxxk, n is: " + n);
    }
}
Why the output is "n is: 300"? n isn't explicitly synchronized. And if I uncomment "Thread.sleep", the output is "n is: 299 or less".
 
     
     
     
     
    