原子性和易变性

作者: 桐桑入梦 | 来源:发表于2020-03-09 13:03 被阅读0次

当一个域的值依赖于它之前的值时候,那么volatile也无法正常的工作。这里的i++就是这样,i++即 i = i + 1,这里的读取和写入是两个步骤。因此使用了volatile不能保证这个操作的正常运行。因为可能在读取之后另外一个线程再次读取了内容。

package concurrency;

import typeinfo.interfacea.A;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class AtomicityTest implements Runnable{
    private int i = 0; //没有使用volatile修饰,存在可视性问题
    //这里缺少同步使得数值可以处在稳定的状态被读取
    public int getValue(){
        return i;
    }

    private synchronized void evenIncrement(){
        i++;
        i++;
    }
    @Override
    public void run(){
        while( true )
            evenIncrement();
    }

    public static void main(String[] args) {
        AtomicityTest at = new AtomicityTest();
        ExecutorService exec = Executors.newCachedThreadPool();
        exec.execute( at );
        exec.shutdown();

        while( true ) {
            int val = at.getValue();
            if( val % 2 != 0 ){
                System.out.println( val );
                System.exit(0 );
            }
        }
    }
}

相关文章

  • 原子性和易变性

    当一个域的值依赖于它之前的值时候,那么volatile也无法正常的工作。这里的i++就是这样,i++即 i = i...

  • 原子性和易变性2

    运行的结果: 问题:第一个出现重复数字的线程执行了System.exit( 0 ),那么终止了JVM的运行,为什么...

  • 可见性,原子性,不变性

    可见性 当一个线程修改了对象状态后,其他线程能够看到发生的状态变化 如何保证? 加锁,当线程B执行由锁保护的同步代...

  • 存在的永恒性和易变性

    存在的是永恒的,变化是一种存在转变为另一种存在,如此前一种存在必然化作虚无。但是存在和虚无对立,存在并非虚无,所以...

  • 阿里面试题(题目来源网络)

    如何保证线程安全?从那几个角度入手。 原子性可见性不变性 synchronized与lock的区别,使用场景。sy...

  • 有趣的知识点

    看到行为的归因,分别有几种方式: 1.内归因和外归因 2.可控性和不可控性 3.稳定性和易变性 很多时候自己做事情...

  • 混凝土拌合物的和易性和混凝土的强度

    知识点:【掌握】混凝土拌合物的和易性和混凝土的强度 一、混凝土拌合物的和易性 1、和易性包括流动性、黏聚性和保水性...

  • 【java并发编程实战】第二章笔记:对象的共享

    1.重要的属性 可见性,不变性,原子性 1.1可见性 当一个线程修改某个对象状态的时候,我们希望其他线程也能看到发...

  • Objective-c 属性存取器@property默认属性

    原子性 nonatomic 非原子性访问 atomic 原子性访问,默认值 读写权限 readonly 只读 re...

  • Java 多线程三大核心

    目录:一、 原子性二、可见性三、顺序性 一、 原子性 Java 的原子性就和数据库事务的原子性差不多,一个操作中要...

网友评论

    本文标题:原子性和易变性

    本文链接:https://www.haomeiwen.com/subject/omxpdhtx.html