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
- i++和++i在多线程中的表现,volatile和加锁
- for(int i = 0; i < 10; i++)和ctrl z在VC++6.0和VS2005中的不同表现
- i++ 是否为原子操作 和 Java中的volatile关键字
- Java中的i++和i--
- C#中的i++和++i
- C++中的++i和i++
- java中的i++和++i
- 混乱中的i++和++i
- ++i i++ 在C语言和java中的区别
- i=i++在Java和C++中的输出
- 关于Java中的i++和++i
- java关键字volatile和synchronized在多线程中的应用
- ++i,i++,--i和i--的区分
- 大话 i++、++i和i=++i、i=i++
- 关于i++和++i
- i++和++i问题
- i++和++i
- ++i和i++
- VS2010全部快捷键
- postgres--常用操作小记
- 手动关闭mongodb的mongod进程
- 有关Windows启动,GNU GRUB和GRUB4DOS的一些启
- 《你的名字》
- i++和++i在多线程中的表现,volatile和加锁
- GridView基础学习01
- sortedArrayUsingComparator详解
- requestWindowFeature(标题栏)
- android 动画效果
- css3 颜色渐变
- 【Unity】好插件让你事半功倍!—资源篇
- PostgreSQL 9.5新特性
- .NET随机生成验证码(一般处理程序)