多个atomic类连续调用能否构成原子性?

答案是不能保证,具体可以参考下边案例:

public class MyAtomic {

    AtomicInteger count = new AtomicInteger(0);

    public void test(){
        for(int i=0;i<10000;i++){
            /*此处模拟多个类连续调用:可能出现线程一拿到count为999,线程二拿到count为999,
            这样会造成count进行多次+1,所以输出的结果会大于一千*/
            if(count.get()<1000) {
                count.incrementAndGet();
            }
        }
    }
    public static void main(String args[]){
        MyAtomic myAtomic = new MyAtomic();
        List<Thread> threadList = new ArrayList<>();
        for(int i=0;i<10;i++){
            threadList.add(new Thread(myAtomic::test,"thread-"+i));
        }
        threadList.forEach((o)->o.start());
        threadList.forEach((o)->{
            try {
                o.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        System.out.println(myAtomic.count);
    }

}

原文地址:https://www.cnblogs.com/smallVampire/p/12118480.html

时间: 2024-10-14 12:37:35

多个atomic类连续调用能否构成原子性?的相关文章

类的连续调用方法

class a{ private $b = 0; public function c( $Num = 0 ) { $this->b = $Num; return $this; //关键就在这里,有这条就可以连续调用了, } public function d($d) { $this->b = $this->b+$d; return $this; } public function e(){ echo $this->b; } } //接下来是调用 $Obj = new a; $Obj

C++——类的成员函数的连续调用与返回值问题

一.返回值问题 1 #include <iostream> 2 3 using namespace std; 4 5 class X 6 { 7 public: 8 int a = 3; 9 X set1(int b) 10 { 11 a = b; 12 return *this; 13 } 14 }; 15 16 int main() 17 { 18 X x; 19 x.set1(6); 20 cout << x.a; 21 22 return 0; 23 } 此处set1函数的

Atomic类和CAS

说Atomic类之前,先聊一聊volatile. 对volatile的第一印象就是可见性.所谓可见性,就是一个线程对共享变量的修改,别的线程能够感知到. 但是对于原子性,volatile是不能保证的.来看看自增操作的问题: volatile int i; i++; i++ 在多线程环境下,是不能保证最终的结果正确的.比如某个时刻,i=5,线程A读取了i的值,说时迟那时快,就在马上要执行++操作时,线程A突然就被切换走了:然后线程B也读取i的值,进行了++操作.这时i的值是6,即使线程A的工作内存

json类 方便调用

jsonutil类 1 package *********** 2 3 import java.lang.reflect.Field; 4 import java.lang.reflect.Type; 5 import java.util.ArrayList; 6 import java.util.HashMap; 7 import java.util.Iterator; 8 import java.util.List; 9 import java.util.Map; 10 11 import

java类中调用servlet

一.Java中调用servlet说明: 我们有时可能需要在Java类中调用Servlet从而实现某些特殊的功能,在JavaAPI中提供了一个URL的类,其中openStream( )方法可以打开URL的连接,并返回一个用于该连接读入的InputStream. 二.Java中调用servlet应用举例: package com.solid.test; import java.io.BufferedReader; import java.io.IOException; import java.io.

连续调用scanf的问题总结

对于非常简单的scanf函数,一直使用,但是却是有很多的知识点没有掌握好,现总结如下: 1.多个scanf之后,后序以 scanf("%c",&c) 当程序连续调用scanf 函数的,前面的获得输入接收的时候,一般结束都是以一个空白字符(空格.enter),比如enter 结束输入:但是,当后面接着是还有一个以 scanf("%c",&a) 的时候,则上面输出 enter 作为结束符,就会被输入到a,从而导致了a 为空. (1)以%d 继续输入的时候

MFC中如何在一个类中调用另一个类的控件

学习记录: 两个类,一个为主类 1个为:CCkDlg,主类 1个为: Https,用来做HTTPS请求获得页面状态. 测试界面如下: CCkDlg 类里定义函数 void CCkDlg::printf_r(CString str) //用于输出日志信息 { m_log.SetSel(-1,-1); m_log.ReplaceSel(str + "\r\n",1); } Https 类里: #pragma once class CCkDlg; //集成cckDlg class Https

spring管理的类如何调用非spring管理的类

spring管理的类如何调用非spring管理的类. 就是使用一个spring提供的感知概念,在容器启动的时候,注入上下文即可. 下面是一个工具类. 1 import org.springframework.beans.BeansException; 2 import org.springframework.context.ApplicationContext; 3 import org.springframework.context.ApplicationContextAware; 4 imp

Java的Atomic类分析

Atomic包介绍 Java1.5的Atomic包名为java.util.concurrent.atomic.这个包提供了一系列原子类.这些类可以保证多线程环境下,当某个线程在执行atomic的方法时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个线程执行.Atomic类在软件层面上是非阻塞的,它的原子性其实是在硬件层面上借助相关的指令来保证的. Atomic包中的类可以分成4组: AtomicBoolean,AtomicInteger,At