千锋Java培训技术分享:Java中的原子操作
儿童文学
来源:本站
2019-07-29

千锋Java培训技术分享:Java中的原子操作

  1、Java中的原子操作是什么  所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间切换到另一个线程。   2、Java中的原子操作介绍:  的包为  这个包里面提供了一组原子类。 其基本特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性。

  即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择另一个线程进入,这只是一种逻辑上的理解。 实际上是借助硬件的相关指令来实现的,但不会阻塞线程(synchronized会把别的等待的线程挂,或者说只是在硬件级别上阻塞了)。   其中的类可以分成4组  -AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference  -AtomicIntegerArray,AtomicLongArray  -AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater  -AtomicMarkableReference,AtomicStampedReference,AtomicReferenceArray  Atomic类的作用  -使得让对单一数据的操作,实现了原子化  -使用Atomic类构建复杂的,无需阻塞的代码  -访问对2个或2个以上的atomic变量(或者对单个atomic变量进行2次或2次以上的操作)通常认为是需要同步的,以达到让这些操作能被作为一个原子单元。

  AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference这四种基本类型用来处理布尔,整数,长整数,对象四种数据。

  -构造函数(两个构造函数)  -默认的构造函数:初始化的数据分别是false,0,0,null  -带参构造函数:参数为初始化的数据  -set()和get()方法:可以原子地设定和获取atomic的数据。

类似于volatile,保证数据会在主存中设置或读取  -getAndSet()方法  -原子的将变量设定为新数据,同时返回先前的旧数据  -其本质是get()操作,然后做set()操作。

尽管这2个操作都是atomic,但是他们合并在一起的时候,就不是atomic。 在Java的源程序的级别上,如果不依赖synchronized的机制来完成这个工作,是不可能的。

只有依靠native方法才可以。

  -compareAndSet()和weakCompareAndSet()方法  -这两个方法都是conditionalmodifier方法。

这2个方法接受2个参数,一个是期望数据(expected),一个是新数据(new);如果atomic里面的数据和期望数据一致,则将新数据设定给atomic的数据,返回true,表明成功;否则就不设定,并返回false。   -对于AtomicInteger、AtomicLong还提供了一些特别的方法。 getAndIncrement()、incrementAndGet()、getAndDecrement()、decrementAndGet()、addAndGet()、getAndAdd()以实现一些加法,减法原子操作。

(注意--i、++i不是原子操作,其中包含有3个操作步骤:第一步,读取i;第二步,加1或减1;第三步:写回内存)。

  以上就是我在千锋一些学习方法的总结,我认为自己还可以学得更好,更强。

我朝着这个目标前行着,加油!相关文章。