「java原子性」JAVA原子性操作与事务

博主:adminadmin 2022-11-26 08:42:07 67

本篇文章给大家谈谈java原子性,以及JAVA原子性操作与事务对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

在java中,什么是原子性

不能被分开操作的一段代码,就叫原子对象。。

比如,你在atm取款机取钱,atm程序中吐钱跟在你账户上扣掉等额的数目就是一个原子性的操作,这两个动作一定要连在一起操作,要么都成功,要么都失败,不可以被分开只执行某一部分。

像这样的操作,我们叫它原子操作。

吐钱跟账户上扣钱这两个行为对象是严格合为一体的,不可以被分开,我们称这样的对象为原子对象

java 多线程里面经常提到原子性,那原子性到底是什么呢?求教!

原子性就是说一个操作不可以被中途cpu暂停然后调度, 即不能被中断, 要不就执行完, 要不就不执行. 如果一个操作是原子性的, 那么在多线程环境下, 就不会出现变量被修改等奇怪的问题.

java多线程中如何保证变量的可见性,原子性

首先,要知道原子性和可见性是在并发环境需要思考的问题,所以下面的回答是围绕了并发场景来描述的。

如果大家不明白并发场景,请先了解java并发

原子性,可以理解为CPU层面不能分割的操作,那么 i++是原子操作吗?不是的,实际它是i=i+1,这个操作首先要读取i的值,然后为i值加1。是需要拆分的。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。有好几种方式实现一个原子操作。java提供了 sychronized代码块,lock接口(它的实现重入锁是比较常用的)。还可以使用原子数据结构。AtomicInteger、AtomicLong、AtomicReference等。

可见性。可以理解为线程层面各个线程之间对某个操作是透明的,各个线程可以及时知道引用的改变。volatile修饰的变量可以保证可见性,假如,一个变量只有 1或者0两种情况。那么volatile修饰之后,就不需要对这个变量加同步操作了。强调一下。volatile不能保证原子性。volatile修饰的整数i,在多线程下 i++之后,不能得到预期的值

java volatile变量为什么不能保证原子性

被volatile修饰的变量保证的是可见性,不是原子性。这是两个不同的概念。

可见性是指不论在哪个线程中看,同一个对象同一时刻的值总是一样的,不会出现不一致的情况。

原子性是指一个操作要么完成,要么没有完成,不会出现完成了一半的情况。

java 程序中怎么保证多线程的运行安全?

并发编程三要素(线程的安全性问题体现在):

原子性:原子,即一个不可再被分割的颗粒。原子性指的是一个或多个操作要么 全部执行成功要么全部执行失败。

可见性:一个线程对共享变量的修改,另一个线程能够立刻看到。 (synchronized,volatile)

有序性:程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行 重排序)

出现线程安全问题的原因:

线程切换带来的原子性问题

缓存导致的可见性问题

编译优化带来的有序性问题

解决办法:

JDK Atomic开头的原子类、synchronized、LOCK,可以解决原子性问题

synchronized、volatile、LOCK,可以解决可见性问题

Happens-Before 规则可以解决有序性问题

java原子性的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于JAVA原子性操作与事务、java原子性的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-26,除非注明,否则均为首码项目网原创文章,转载请注明出处。