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()才可以避免并发问题

时间: 2024-08-06 07:02:10

java的原子性操作有哪些的相关文章

Java原子性操作类应用

Java5的线程并发库中,提供了一组atomic class来帮助我们简化同步处理.基本工作原理是使用了同步synchronized的方法实现了对一个long, integer, 对象的增.减.赋值(更新)操作 java.util.concurrent在并发编程中很常用的实用工具类. |----locks为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器 |----atomic类的小工具包,支持在单个变量上解除锁的线程安全编程.可以对基本类型.数组中的基本类型.类中的基本类型等进行操

一段JAVA代码了解多线程,JUC、CAS原子性操作。

@Test public void testPaceController_multiThread() throws InterruptedException { final PaceController paceController = new PaceController(1000, 160d); final Node node = mock(Node.class); final AtomicInteger passcount = new AtomicInteger(); final Atom

Java原子性操作之——Atomic包的原理分析

Atomic: Atomic包是java.util.concurrent下的另一个专门为线程安全设计的java的包,包含多个原子性操作的类.基本特性就是在多线程情况下,当多个线程想要同时操作这些类的某些实例方法时,具有排他性,也就是当某个线程在执行某个方法时,不会被其他线程打断,其他线程会在外部等待,一直等到该方法执行完毕,才由JVM从等待队列中选择另一个线程进入,这只是一种逻辑上的理解.实际上是借助硬件的相关指令来实现的,不会阻塞线程(只是在硬件级别去阻塞了).可以对基本数据,数组中的基本数据

【java并发】原子性操作类的使用

在java5以后,我们接触到了线程原子性操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,本文总结一下Atomic系列的类的使用方法,其中包含: 类型 Integer Long 基本类型 AtomicInteger AtomicLong AtomicBoolean 数组类型 AtomicIntegerArray AtomicLongArray AtomicReferenceArray 属性原子修改器 AtomicIntegerFieldUpda

java 并发原子性与易变性 来自thinking in java4 21.3.3

java 并发原子性与易变性  具体介绍请參阅thinking in java4 21.3.3 thinking in java 4免费下载:http://download.csdn.net/detail/liangrui1988/7580155 package org.rui.thread.volatiles; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 假设

8.Java5原子性操作类的应用

1 import java.util.concurrent.atomic.AtomicInteger; 2 /** 3 * java5原子性操作类的应用 4 * @author LiTaiQing 5 * 6 */ 7 public class AtomClassTest { 8 9 public static void main(String[] args) { 10 AtomicInteger i = new AtomicInteger(0); 11 System.out.println(i

自己动手写把”锁”---原子性操作

所谓的原子性,就是在执行过程中不会被线程调度机制打断的操作,这种操作从开始就一直运行到结束,中间不存在任何上下文切换. 还是以上篇讲到的x++操作为例.这是一个典型的'读改写'的操作,在多线程的情况下,必须需要硬件的支持来保证'读改写'的原子性,底层原理可以简单理解,通过锁总线的方式来实现.不过这里咱们不说硬件,咱们先研究下Java是如何原子性实现++操作的. 在Java中,如果要实现一个在多线程下正常工作的累加计数器,首先想到的就是并发包里的AtomicXXX类,如一下例子代码: public

JAVA使用和操作properties文件

java中的properties文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件,文件的内容是格式是"键=值"的格式,在properties文件中,可以用"#"来作注释,properties文件在Java编程中用到的地方很多,操作很方便.Properties 类存在于包 Java.util 中,该类继承自 Hashtable. 1. getProperty ( String  key) ,   用指定的键在此属性列表中搜索

Java 文件写操作

在进行文件写操作的时候,有两种操作方方式.一个是连续写,一个是覆盖式写. 代码如下: import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; // text:要写入的内容:isAppend:写入方式,true为连续写,false为覆盖式写入. public void write(String text