原子变量与非阻塞同步机制

1.非阻塞算法被广泛用于在操作系统和JVM中实现线程/进度调度机制、垃圾回收机制以及锁和其他并发数据结构。

非阻塞算法可以使多个线程在竞争相同的数据时不会发生阻塞,因此它能在粒度更细的层次协调,并且极大地减少调度开销,非阻塞算法不存在死锁和其他活跃性问题,

原子变量类:

java5.0后,使用原子变量类(例如AtomicInteger和AtomicReference)来构建高效的非阻塞算法

原子变量类比锁的粒度更细量级更轻,将发生竞争的范围缩小到单个变量上。

基本类型的包装类是不可修改的,而原子变量类是可修改的,在原子变量类中没有重新定义hashCode或equals方法,每个实例都是不同的,不宜用做基于散列的容器中的键值

2.原子变量提供与volatile类型变量相同的内存语义,原子变量更加适合用于实现计数器、序列发生器和统计数据收集

锁的劣势:

1.锁能采用独占方式来访问这些变量,并且对变量的任何修改对随后获得这个锁的其他线程都是可见的,当在锁上存在激烈的竞争时,挂起和恢复线程等过程中存在着很大的开销。

volatile是一种轻量级的同步机制

使用volatile变量时不会发生上下文切换或线程调度等操作。volatile存在一些局限:虽然它们提供了相似的可见性保证,但不能用于构建原子的复合操作。用来确保将变量的更新操作通知到其他线程,编译器与运行时都会注意到这个变量是共享的,因此不会讲该变量上的操作与其他内存操作仪器重排序,volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方

CAS机制:

1.当多个线程尝试使用CAS同时更新一个变量时,只有其中一个线程能更新变量的值,而其他线程都将失败,失败的线程并不会被挂起(这与获取锁的情况不同:当获取锁失败时,线程将被挂起),而是被告知在这次竞争中失败,并可以再次尝试

2.CAS主要缺点:它将使调用者处理竞争问题(通过重试、回退、放弃),而在锁中能自动处理竞争问题(线程在获得锁之前将一直阻塞)

3.CAS的性能会随着处理器数量的不同而变化很大

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值