㈠ java的原子数据类型有哪些
选B了!
原子类型就是基本数据类型。一共有八种:
byte
short
int
long
char
boolean
float
double
String也可以算,也可以不算。既可以用
String
str="...";来定义,也可以用
String
str=new
String("...");来定义
㈡ java 程序中怎么保证多线程的运行安全
并发编程三要素(线程的安全性问题体现在):
原子性:原子,即一个不可再被分割的颗粒。原子性指的是一个或多个操作要么 全部执行成功要么全部执行失败。
可见性:一个线程对共享变量的修改,另一个线程能够立刻看到。 (synchronized,volatile)
有序性:程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行 重排序)
出现线程安全问题的原因:
线程切换带来的原子性问题
缓存导致的可见性问题
编译优化带来的有序性问题
解决办法:
JDK Atomic开头的原子类、synchronized、LOCK,可以解决原子性问题
synchronized、volatile、LOCK,可以解决可见性问题
Happens-Before 规则可以解决有序性问题
㈢ java的原子性操作有哪些
Java中的原子操作包括:
1)除long和double之外的基本类型的赋值操作
2)所有引用reference的赋值操作
3)java.concurrent.Atomic.* 包中所有类的一切操作
count++不是原子操作,是3个原子操作组合
1.读取主存中的count值,赋值给一个局部成员变量tmp
2.tmp+1
3.将tmp赋值给count
可能会出现线程1运行到第2步的时候,tmp值为1;这时CPU调度切换到线程2执行完毕,count值为1;切换到线程1,继续执行第3步,count被赋值为1------------结果就是两个线程执行完毕,count的值只加了1;
还有一点要注意,如果使用AtomicInteger.set(AtomicInteger.get() + 1),会和上述情况一样有并发问题,要使用AtomicInteger.getAndIncrement()才可以避免并发问题
㈣ java中什么是原子对象
不能被分开操作的一段代码,就叫原子对象。。
比如,你在ATM取款机取钱,ATM程序中吐钱跟在你账户上扣掉等额的数目就是一个原子性的操作,这两个动作一定要连在一起操作,要么都成功,要么都失败,不可以被分开只执行某一部分。
像这样的操作,我们叫它原子操作。
吐钱跟账户上扣钱这两个行为对象是严格合为一体的,不可以被分开,我们称这样的对象为原子对象
㈤ 在java中,什么是原子性
:原子性,就是不会有中间状态存在,要么什么都没改变,要么全都改变。不会有一部分没改变,一部分改变了。 引用赋值,或者说所有赋值操作都不是原子性的。 对应的原子类是AtomicReferenc。类似的也有AtomicLong之类的原子类,来保证赋值的原子性
㈥ 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基本数据类型是原子的但是i 还存在线程安全问题
这个问题本身是错误的观点,基本数据类型是数据结构,原子性是操作定义,不是一个概念。
原话是这样的,基本数据类型的赋值是原子性操作。这里还要排除long和double,或者标明64bit操作系统。因为long和double类型是8字节,而低位操作系统(32bit)单次内存的存储结构最大只能存储4个字节,所以每次操作都要分两次进行,也就是非原子性操作。
那int类型的i++为什么还有线程安全问题(推测了问题真正想表达的意思)?因为i++在指令中是赋值和自增两个操作。赋值没问题,但自增是要读取和写入两个操作,很明显是非原子性操作,自然就有安全问题。另外volatile只有两个作用,一个是禁用指令重排,一个是强制读取主存,没有绝对的原子性。