首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java并发编程-原子变量

原子布尔 AtomicBoolean AtomicBoolean 类为我们提供了一个可以用原子方式进行读和写的布尔值,它还拥有一些先进的原子操作,比如 compareAndSet()。...原子整型 AtomicInteger AtomicInteger 类为我们提供了一个可以进行原子读和写操作的 int 变量,它还包含一系列先进的原子操作,比如 compareAndSet()。...原子长整型 AtomicLong AtomicLong 类为我们提供了一个可以进行原子读和写操作的 long 变量,它还包含一系列先进的原子操作,比如 compareAndSet()AtomicLong...减小 AtomicLong 的值 AtomicLong 类还提供了一些减小 AtomicLong 的值的原子方法。...原子引用型 AtomicReference AtomicReference 提供了一个可以被原子读和写的对象引用变量。

2.2K30
您找到你想要的搜索结果了吗?
是的
没有找到

「跬步千里」详解 Java 内存模型与原子、可见性、有序

3)介绍 Java 内存模型 4)详解 Java 内存模型的三大性质(原子、可见性、有序),这也是判断线程安全的三个重要指标。...原子 什么是原子 类比物理机,拥有缓存一致协议来规定主内存和高速缓存之间的操作逻辑,那么 JMM 中主内存与工作内存之间有没有具体的交互协议呢? Of Course!...由 Java 内存模型来直接保证的原子变量操作包括 read、load、assign、use、store 和 write这 6 个,我们大致可以认为,基本数据类型的访问、读写都是具备原子的(例外就是...如果应用场景需要一个更大范围的原子保证,Java 内存模型还提供了 lock 和 unlock 操作来满足这种需求。...上面我提过一嘴,为了保证 Java 程序中的内存访问操作在并发下仍然是线程安全的,JMM 规定了在执行 8 种基本原子操作时必须满足的一系列规则,这其中有一条规则正是 sychronized 能够保证原子的理论支撑

34610

Java内存模型JMM 高并发原子可见性有序简介 多线程中篇(十)

可见性 有序 原子 原子 Atomic,意指不可分割,也就是作为一个整体,要么全部执行,要么不会执行 对于共享变量访问的一个操作,如果对于除了当前执行线程以外的任何线程来说,都是不可分割的,那么就是具有原子...,既然是不可分割的,那么就是要么做了,要么没做,不会中间被耽搁,最终的结果看起来就好似串行的执行一样,不会出现线程安全问题 Java中有两种方式实现原子 一种是使用锁机制,锁具有排他,也就是说它能够保证一个共享变量在任意一个时刻仅仅被一个线程访问...、可见性、有序 前面说过,原子保障了要么执行要么不执行,不会出现中间结果,但是即使原子了,不可分割了,但是是否对另外一个可见,是无法保障的,所以需要可见性 而有序则是另外的线程对当前线程执行看起来的顺序...JMM模型则是对于JVM对于内存访问的一种规范,多线程工作内存与主内存之间的交互原则进行了指示,他是独立于具体物理机器的一种内存存取模型 对于多线程的数据安全问题,三个方面,原子、可见性...原文地址:Java内存模型JMM 高并发原子可见性有序简介 多线程中篇(十)

86230

java并发之原子、可见性、有序

Java中,对基本数据类型的变量的读取和赋值操作是原子操作,即这些操作是不可被中断的,要么执行,要么不执行。 上面一句话虽然看起来简单,但是理解起来并不是那么容易。...其实只有语句1是原子操作,其他三个语句都不是原子操作。 语句1是直接将数值10赋值给x,也就是说线程执行这个语句的会直接将数值10写入到工作内存中。...语句2实际上包含2个操作,它先要去读取x的值,再将x的值写入工作内存,虽然读取x的值以及 将x的值写入工作内存 这2个操作都是原子操作,但是合起来就不是原子操作了。...从上面可以看出,Java内存模型只保证了基本读取和赋值是原子操作,如果要实现更大范围操作的原子,可以通过synchronized和Lock来实现。...有序 有序:即程序执行的顺序按照代码的先后顺序执行。 在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确

99220

Java 并发篇03 -序、可见性、原子

这篇文章,我们将给大家来讲解引起我们并发问题的三大因素--— 有序、可见性、原子。这三个问题是属于并发领域的所以并不涉及语言。 首先,我们来聊聊什么是安全。...比如: private Integer sum(int num) { return ++num; } ---- 原子 说到原子,可能大家的第一反应就是 i++ 和 ++i 了。...执行写入和读取到内存的两个线程可以在 CPU 时钟时间方面与其他操作保持一致,但可能看不到彼此一致的更改(内存一致错误),除非它们之前发生关系。...易失变量规则:在对该相同字段的每次后续读取之前发生对易失字段的写入。易失字段的写入和读取具有与进入和退出监视器(读取和写入时的同步块)类似的内存一致效果,但实际上没有获取监视器/锁定。...而这也是Java 通过内存模型定义及其底层的关系。也是 一次编写,随从运行的核心。

47920

JAVA原子、可见性与有序

JAVA原子、可见性与有序了解一波。 原子(Atomicity):一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。...具体到底层的指令(上文内存间操作提到的8个指令),由Java内存模型来直接保证的原子变量操作包括read、load、assign、use、store和write,我们大致可以认为基本数据类型的访问读写是具备原子的...如果应用场景需要一个更大范围的原子保证,Java内存模型还提供了lock和unlock操作来满足这种需求,尽管虚拟机未把lock和unlock操作直接开放给用户使用,但是却提供了更高层次的字节码指令monitorenter...和monitorexit来隐式地使用这两个操作,这两个字节码指令反映到Java代码中就是同步块——synchronized关键字,因此在synchronized块之间的操作也具备原子。...Java内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方式来实现可见性的,无论是普通变量还是volatile变量都是如此, 普通变量与volatile

1.5K10

Java规则:原子类的相等判断

Java的规则S2204规定,对于Java并发库定义的诸如AtomicInteger、AtomicLong等原子类,不能使用equals()方法测试其值是否相等。...不过,为了避免破坏原子类的原子,这些原子类的主要方法都是final方法。...原子类的派生子类只能重写如下图所示的操作(以AtomicInteger的子类为例): 原子类的特性 原子类属于Java 5引入的并发包中的内容。...Bruce Eckel认为:“这些类提供了原子的更新能力,充分利用了现代处理器的硬件级原子,实现了快速、无锁的操作。”保证操作的原子是确保线程安全的有效手段。...,则将内存值设置为更新值(update) 更新成功返回true,若返回false,则说明内存值并不等于旧的预期值(可能其他线程已经更新了内存值) 可以通过循环判断该方法返回的值,如果为false,就继续取内存值和旧的预期值进行比较

1.1K20

内存可见性和原子:Synchronized和Volatile的比较

Java多线程之内存可见性和原子:Synchronized和Volatile的比较 【尊重原创,转载请注明出处】http://blog.csdn.net/guyuealian/article/...details/52525724 在说明Java多线程内存可见性之前,先来简单了解一下Java内存模型。...类似"a += b"这样的操作不具有原子,在某些JVM中"a += b"可能要经过这样三个步骤: ① 取出a和b ② 计算a+b ③ 将计算结果写入内存 (1)Synchronized:保证可见性和原子...Synchronized能够实现原子和可见性;在Java内存模型中,synchronized规定,线程在加锁时,先清空工作内存→在主内存中拷贝最新变量的副本到工作内存→执行完代码→将更改后的共享变量的值刷新到主内存中...但volatile不保证volatile变量的原子,例如: [java] view plain copy Private int Num=0; Num++;//Num不是原子操作 Num

1.4K40

Java 中 long 和 double 的原子

---- java中基本类型中,long和double的长度都是8个字节,32位(4字节)处理器对其读写操作无法一次完成,那么,JVM,long和double是原子的吗?...JVM中对long的操作是不是原子操作? 首先,通过一段程序对long的原子进行判断。...JVM内存模型中定义了8中原子操作: lock:将一个变量标识为被一个线程独占状态 unclock:将一个变量从独占状态释放出来,释放后的变量才可以被其他线程锁定 read:将一个变量的值从主内存传输到工作内存中...如果JVM要保证long和double读写的原子,势必要做额外的处理。 那么,JVM有对这一情况进行额外处理吗?...在换了64位的JVM之后,多次运行,结果都是正确的 64-bit 运行正确 运行正确 结果表明,在64bit的虚拟机下,long的处理是原子的。

2.2K20

Java并发编程(一)---原子,可见性,有序

正文 原子 原子是指一个操作是不可中断的,即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他的线程干扰。 一般认为CPU的指令都是原子操作,但是我们写的代码就不一定是原子操作了。...故线程切换造成的原子性问题。...例如:count=count+1 共有三个指令 指令一: 将count值从内存加载到到CPU的寄存器中 指令二:在寄存器中+1操作 指令三 :将新值写入到内存中(由于缓存机制,写入的可能是CPU的缓存而不是内存...有序 在并发时,由于编译器重排序导致不是按照程序的顺序执行。...比如:某个线程将一个共享值优化到了内存中,而另一个线程将这个共享值优化到了缓存汇总,当修改内存中的是值的时候,缓存中的值是不知道这个修改的。

23210

并发编程-原子

2.2.3.复合操作(Compound Actions ) LazyInitRace和UnsafeCountingFactorizer两个都包含了一系列需要在同一个状态上相对于其他操作保证原子或者不可分割的操作...原子操作是指,对于访问同一个状态的所有操作(包括该操作本身)来说,这个操作是一个以原子方式执行的操作。...我们把check-then-act以及read-modify-write一系列统一称之为compound actions,就是复合操作,或者叫组合操作:为了确保线程安全,一系列的操作的执行都必须是原子操作...在后面的译文中,我们将会介绍锁机制,那种java内建的确保原子的机制。现在的话,我们就暂时通过现存的线程安全类来修复问题吧,就像程序清单2.4里的CountingFactorizer那样。...java.util.concurrent.atomic包里包含了原子变量类,用来实现数字以及对象引用上的原子状态转换。

1.3K110

Java并发编程:AQS的原子如何保证

在并发实现中CAS操作必须具备原子,而且是硬件级别的原子。我们知道Java被隔离在硬件之上,硬件级别的操作明显力不从心。...02 Unsafe的魔法 Unsafe是一个很强大的类,它可以分配内存、释放内存、可以定位对象某字段的位置、可以修改对象的字段值、可以使线程挂起、使线程恢复、可进行硬件级别原子的CAS操作等等。...这段代码演示了如何获取Java对象的相对地址偏移量以及使用Unsafe来完成CAS操作,最终输出的是flag字段的内存偏移量及CAS操作后的值。...这段代码演示了如何获取Java对象的相对地址偏移量以及使用Unsafe来完成CAS操作,最终输出的是flag字段的内存偏移量及CAS操作后的值。...通常我们使用Java时不需要在内存中处理Java对象及内存地址位置,但有的时候我们被迫必须要操作Java对象相关的地址,于是我们只能使用Unsafe类。

39330

Java 并发编程:AQS 的原子如何保证

在并发实现中CAS操作必须具备原子,而且是硬件级别的原子。我们知道Java被隔离在硬件之上,硬件级别的操作明显力不从心。...Unsafe的魔法 Unsafe是一个很强大的类,它可以分配内存、释放内存、可以定位对象某字段的位置、可以修改对象的字段值、可以使线程挂起、使线程恢复、可进行硬件级别原子的CAS操作等等。...这段代码演示了如何获取Java对象的相对地址偏移量以及使用Unsafe来完成CAS操作,最终输出的是flag字段的内存偏移量及CAS操作后的值。...总结 这里主要讲解了Unsafe类如何让Java层能实现硬件级别的原子操作,同时也了解了Unsafe类拥有很多法魔技能。...通常我们使用Java时不需要在内存中处理Java对象及内存地址位置,但有的时候我们被迫必须要操作Java对象相关的地址,于是我们只能使用Unsafe类。

46850

AtomicReference原子引用

AtomicReference AtomicReference类提供了一个可以原子读写的对象引用变量。...unsafe.getAndSetObject(this, valueOffset, newValue); } } compareAndSet采用CAS保证并发 AtomicReference 所提供的某些方法可以进行原子操作...,如compareAndSet、getAndSet,这仅仅是对引用进行原子操作 AtomicReference 不能保证对象中若存在属性值修改是线程安全的,如假设引用对象是person,修改person...AtomicintegerFieldUpdater安全的修改自定义对象 atomic包中提供AtomicReferenceFieldUpdater、AtomicIntegerFieldUpdater、AtomicLongFieldUpdater,原子的更新某一个类实例的指定的某一个字段...AtomicIntegerFieldUpdaterImpl (tclass, fieldName, Reflection.getCallerClass()); } /** * 原子设置

1.6K00

Java三大性质总结:原子、可见性以及有序

三大性质简介 在并发编程中分析线程安全的问题时往往需要切入点,那就是两大核心:JMM抽象内存模型以及happens-before规则,三条性质:原子,有序和可见性。...当然,java内存模型中定义了8中操作都是原子的,不可再分的。...注意的是:java内存模型只是要求上述两个操作是顺序执行的并不是连续执行的。也就是说read和load之间可以插入其他指令,store和writer可以插入其他指令。...由原子变量操作read,load,use,assign,store,write,可以大致认为基本数据类型的访问读写具备原子(例外就是long和double的非原子协定) synchronized...volatile 在java内存模型中说过,为了性能优化,编译器和处理器会进行指令重排序;也就是说java程序天然的有序可以总结为:如果在本线程内观察,所有的操作都是有序的;如果在一个线程观察另一个线程

1.6K10

高级java必须清楚的概念:原子、可见性、有序

原子、可见性、有序是多线程编程中最重要的几个知识点,由于多线程情况复杂,如何让每个线程能看到正确的结果,这是非常重要的。...原子 原子是指一个线程的操作是不能被其他线程打断,同一时间只有一个线程对一个变量进行操作。...但n++并不是原子的操作,要使用AtomicInteger保证原子。 可见性 可见性是指某个线程修改了某一个共享变量的值,而其他线程是否可以看见该共享变量修改后的值。...每个线程都有自己的工作内存,线程先把共享变量的值从主内存读到工作内存,形成一个副本,当计算完后再把副本的值刷回主内存,从读取到最后刷回主内存这是一个过程,当还没刷回主内存的时候这时候对其他线程是不可见的...明天我再讲讲volatile关键字,它能保证可见性、有序,但不能保证原子

570101

Java学习笔记(Volatile关键字以及原子

概述:JMM(Java Memory Model)Java内存模型,是java虚拟机规范中所定义的一种内存模型。...Java内存模型(Java Memory Model)描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取变量这样的底层细节。...volatile保证数据的可见性,但是不保证原子(多线程进行写操作,不保证线程安全);而synchronized是一种排他(互斥)的机制, 原子概述 概述:所谓的原子是指在一次操作或者多次操作中...对工作内存中的数据进行++操作 将工作内存中的数据写回到主内存 count++操作不是一个原子操作,也就是说在某一个时刻对某一个操作的执行,有可能被其他的线程打断。...概述:java从JDK1.5开始提供了java.util.concurrent.atomic包(简称Atomic包),这个包中的原子操作类提供了一种用法简单,性能高效,线程安全地更新一个变量的方式。

27320

java安全编码指南之:可见性和原子

简介 java类中会定义很多变量,有类变量也有实例变量,这些变量在访问的过程中,会遇到一些可见性和原子的问题。这里我们来详细了解一下怎么避免这些问题。...最简单的解决可见性的办法就是加上volatile关键字,volatile关键字可以使用java内存模型的happens-before规则,从而保证volatile的变量修改对所有线程可见。...如果是共享对象,那么我们就需要考虑在多线程环境中的原子。...如果一个方法使用了多个原子类的操作,虽然单个原子操作是原子的,但是组合起来就不一定了。...保证方法调用链的原子 如果我们要创建一个对象的实例,而这个对象的实例是通过链式调用来创建的。那么我们需要保证链式调用的原子

42821
领券