java中的自增过程不是原子性操作
来源:互联网 发布:小米如何禁止软件更新 编辑:程序博客网 时间:2024/05/01 21:53
在java中多线程访问同一数据时,会出现数据不一致的问题。java中的自增操作需要多步完成,而且不是原子性操作控制。下面的代码说明了问题,源自java编程思想
</pre><pre code_snippet_id="1623662" snippet_file_name="blog_20160325_2_1202041" name="code" class="java">package synchonize;public class EvenGenerator extends IntGenerator {private int currentEvenValue = 0;public int next(){++currentEvenValue;Thread.yield();++currentEvenValue;return currentEvenValue;}public static void main(String []args){EvenChecker.test(new EvenGenerator());}}
package synchonize;public abstract class IntGenerator {private volatile boolean canceled = false;public abstract int next();public void cancel(){canceled = true;}public boolean isCanceled(){return canceled;}}
package synchonize;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class EvenChecker implements Runnable{private IntGenerator generator;private final int id;public EvenChecker(IntGenerator g, int id){this.generator = g; this.id = id;}public void run() {// TODO Auto-generated method stubwhile(!generator.isCanceled()){int val = generator.next();if(val %2 !=0){System.out.println(val + "not even!");generator.cancel();}}}public static void test(IntGenerator gp, int count){System.out.println("press control-c to exit");ExecutorService exec = Executors.newCachedThreadPool();for(int i=0; i < count; i++){exec.execute(new EvenChecker(gp, i));}exec.shutdown();}public static void test(IntGenerator gp){test(gp, 10);}}
好不容易调出这个结果来
press control-c to exit
5not even!
3not even!
7not even!
3not even!
0 0
- java中的自增过程不是原子性操作
- java中的原子性操作
- 关于Java自增操作的原子性
- 关于Java自增操作的原子性
- 关于Java自增操作的原子性
- 关于Java自增操作的原子性
- java中的原子操作
- Java中的原子操作
- C++自增操作与原子性
- 验证java 递增不是原子操作
- java 递增不是原子操作-并发
- count++不是原子性操作测试
- i++不是原子操作
- i++ 不是原子操作
- java中的原子操作类
- Java中的原子操作类
- JAVA中的原子操作类
- C++ 中的原子性操作
- MongoDB学习笔记(查询)
- 设计模式学习笔记(1)
- 1.3.6(extra)
- MongoDB学习笔记(索引)
- Mybatis 的Log4j日志输出问题 - 以及有关日志的所有问题
- java中的自增过程不是原子性操作
- 4. Smarty3:模版中的变量应用
- VB中输出0点几的时候不显示小数点前面的零
- Netty之有效规避内存泄漏
- 数据处理之文件读写
- ServletDate
- Java中由substring方法引发的内存泄漏
- Mongodb固定集合
- mongoDB--GridFS简介