java无锁_java无锁

原子性 :

即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行

可见性:

可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

有序性:

即程序执行的顺序按照代码的先后顺序执行。

volatile:

volatile可以保证线程可见性且提供了一定的有序性,但是无法保证原子性。在JVM底层volatile是采用“内存屏障”来实现的。

1.保证可见性

2.不保证原子性

3.禁止指令重排序

1.AtomicInteger

final int get()        //去的当前值

final void set( int newValue )        //设置当前值

final int getAndSet( int newValue )        //设置新值,并返回旧值

final boolean compareAndSet( int expect, int u )                   //如果当前值为expect,则设置为u

final int getAndIncrement()                   //当前值加1,返回旧值

final int getAndDecrement()                   //当前值减1,返回旧值

final int getAndAdd( int delta )                //当前值增加delta,返回旧值

final int IncremenAndGet()                //当前值加1,返回新值

final int decremenAndGet()                //当前值减1,返回新值

final int addAndGet( int delta)                //当前值增加delta,返回新值

2.Unsafe(不推荐使用,不同jdk实现方法不一样)

3.AtomicReference

对引用进行修改

是一个模板类,抽象化数据类型

主要有get、set 、compareAndSet、getAndSet方法还有layzeSet、weakCompareAndSet

4.AtomicStampedReference

带有邮戳(注:时间戳等,能够标识唯一性的,且有序的数据)的的引用修改类。

应用场景如:多线程写操作时对于数据敏感情况下,监听某一数值条件并进行有限次写操作的情况下,需要对数据当前引用对象进行时间判断是否,这里注意不能用compareAndSet虽然值可能相同,但是我们进行的是有限次写操作,读操作获得值的时间可能在AtomicReference.compareAndSet时取得是值是相同,但对象可能已经被其他线程修改但与当前值相等。所以需要AtomicStampedReference;

5.AtomicIntegerArray、ReferenceArray、LongArray

6.AtomicIntegerFieldUpdater

让普通变量也享受原子操作

方法:

    AtomicIntegerFieldUpdater.newUpdater( Class tclass , String fieldName);

注:普通变量需要加上volatile

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值