i++和++i在多线程中的表现,volatile和加锁

来源:互联网 发布:dom编程艺术第二版 编辑:程序博客网 时间:2024/05/12 23:08

只有加锁够得出争取的结果:

控制台输出:

i++的结果:
1000012113
++i的结果:
1000003505
volatile i++的结果:
1018584689
volatile ++i的结果:
995483979
加锁 i++的结果:
2000000000
加锁  ++i的结果:
2000000000


测试代码如下:

/public class ThreadTest1 {    private static long i = 0;    private static volatile long m = 0;    public static void main(String[] args) throws Exception{        System.out.println("i++的结果:");        new ThreadTest1().test();        ThreadTest1.i = 0;//复位        System.out.println("++i的结果:");        new ThreadTest1().test1();        ThreadTest1.i = 0;//复位        System.out.println("volatile i++的结果:");        new ThreadTest1().test2();        ThreadTest1.m = 0;//复位        System.out.println("volatile ++i的结果:");        new ThreadTest1().test3();        ThreadTest1.m = 0;//复位        System.out.println("加锁 i++的结果:");        new ThreadTest1().test4();        ThreadTest1.i = 0;//复位        System.out.println("加锁  ++i的结果:");        new ThreadTest1().test5();        ThreadTest1.i = 0;//复位    }    private void test() throws Exception{        Runnable runnable = new Runnable() {            @Override            public void run() {                for (int i = 0; i < 1000000000; i++){                    ThreadTest1.i++;                }            }        };        Thread t1 = new Thread(runnable);        Thread t2 = new Thread(runnable);        t1.start();        t2.start();        t1.join();        t2.join();        System.out.println(ThreadTest1.i);    }    private void test1() throws Exception{        Runnable runnable = new Runnable() {            @Override            public void run() {                for (int i = 0; i < 1000000000; i++){                    ++ThreadTest1.i;                }            }        };        Thread t1 = new Thread(runnable);        Thread t2 = new Thread(runnable);        t1.start();        t2.start();        t1.join();        t2.join();        System.out.println(ThreadTest1.i);    }    private void test2() throws Exception{        Runnable runnable = new Runnable() {            @Override            public void run() {                for (int i = 0; i < 1000000000; i++){                    ThreadTest1.m++;                }            }        };        Thread t1 = new Thread(runnable);        Thread t2 = new Thread(runnable);        t1.start();        t2.start();        t1.join();        t2.join();        System.out.println(ThreadTest1.m);    }    private void test3() throws Exception{        Runnable runnable = new Runnable() {            @Override            public void run() {                for (int i = 0; i < 1000000000; i++){                    ++ThreadTest1.m;                }            }        };        Thread t1 = new Thread(runnable);        Thread t2 = new Thread(runnable);        t1.start();        t2.start();        t1.join();        t2.join();        System.out.println(ThreadTest1.m);    }    private void test4() throws Exception{        Runnable runnable = new Runnable() {            @Override            public void run() {                synchronized (ThreadTest1.class){                    for (int i = 0; i < 1000000000; i++){                        ThreadTest1.i++;                    }                }            }        };        Thread t1 = new Thread(runnable);        Thread t2 = new Thread(runnable);        t1.start();        t2.start();        t1.join();        t2.join();        System.out.println(ThreadTest1.i);    }    private void test5() throws Exception{        Runnable runnable = new Runnable() {            @Override            public void run() {                synchronized (ThreadTest1.class){                    for (int i = 0; i < 1000000000; i++){                        ++ThreadTest1.i;                    }                }            }        };        Thread t1 = new Thread(runnable);        Thread t2 = new Thread(runnable);        t1.start();        t2.start();        t1.join();        t2.join();        System.out.println(ThreadTest1.i);    }}

0 0