java中基本类型读写是原子的,那么是不是就是线程安全呢



《thinking in Java》的第21章的《并发》有写:“除了long和double类型,Java基本数据类型都是的简单读写都是原子的,而简单读写就是赋值和return语句。”因此而对于其他自加自减以及其他运算操作,是非原子操作。

但是,虽然读写基本类型是原子的,但其都是在工作内存层面的,由于线程有一个时间分片的概念,并不能保证此时基本类型的数据对于其他线程来说是最新修改值,因此,声明为volative可以保证可视性。

同时,32位机器上更新double或long类型 不是单个操作,不加volatile的话 ,并发情况下针对某个元素的访问可能出现脏读(cpu cache导致的),单纯的替换如果允许脏读的话 ,可以不加这些修饰符 ,如果涉及到非幂等操作 ,还是要用同步修饰符

你可能感兴趣的:(java)