java.util.concurrent.atomic的原子模块
例如,没有表示 byte 的原子类。这种情况不常见,如果要这样做,可以使用 AtomicInteger 来保持 byte 值,并进行适当的强制转换。
AtomicInteger 是 java.util.concurrent.atomic 包下的类,作用是提供原子操作 Integer 类。我们知道在 Java 中, i++、++i 这种操作并不是线程安全的。
如果此方法(在不同的类间参数类型也不同)当前保持 expectedValue,则以原子方式将变量设置为 updateValue,并在成功时报告 true。此包中的类还包含获取并无条件设置值的方法,以及较弱条件的原子更新操作 weakCompareAndSet。
为了解决这个问题,必须保证增加操作是原子的,在JDK5之前我们可以使用同步技术来做到这一点。
软件包 java.util.concurrent.atomic 是类的小工具包,支持在单个变量上解除锁定的线程安全编程。
在java.util.concurrent.atomic包中包含了一些原子变量类,用于实现在数值和对象引用上的原子状态转换。通过用AtomicLong来替换Long类型的计算器,能够确保所有对计数器状态的访问操作都是原子的。
多线程下变量原子操作的几种方法
1、Note:2两个方法主要用于应用中【2种操作的性能是第一种的7-8倍,性能上优于第一种】,第三个方法主要应用于驱动层的。
2、不是的,实际它是i=i+1,这个操作首先要读取i的值,然后为i值加1。是需要拆分的。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。有好几种方式实现一个原子操作。
3、可以使用 synchronized关键字,每次只有一个线程获取锁执行i++操作,但是这种相当于串行,性能较低。每次执行结果都是10000。
4、效果和方法一差不多。 注:同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。
5、只能保证一个共享变量的原子操作 当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁来保证原子性。
6、除非手工调用 ManualResetEvent.Reset()方法,否则 ManualResetEvent 将一直保持有信号状态,其他调用 WaitOne 的线程获得信号得以继续执行。为多个线程共享的变量提供原子操作。
JAVA的基本数据类型和引用数据类型的区别
java中的数据类型分为两大类:基本数据类型和引用数据类型 基本数据类型,包括数值型,字符型和布尔型。数值型:1)整型:byte 1个字节;short 2个字节;int 4个字节;long 8个字节。
java中的基本数据类型,包括数值型,字符型和布尔型。数值型:1)整型:byte ;short;int ;long。
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。原始数据类型保存在栈中,保存的是实际值;引用类型也保存在栈中,保存的是一个实际对象的地址。
基本数据类型有,byte,Java中最小的数据类型。short,短整型。int,整型。long,长整型。float。浮点型,double,双精度浮点型。char,字符型。boolean,布尔类型。
java语言的基本数据类型指的是字节类型byte,短整型short,整型int,长整型long,布尔型boolean,字符类型char,单精度浮点类型float,双精度浮点类型double共八大基本数据类型;引用数据类型指的是类,枚举,接口和数组类型。