资讯专栏INFORMATION COLUMN

java并发编程学习之cas(一)

ConardLi / 1174人阅读

摘要:线程把的值放在中。线程执行,得到的为。,,独占锁,会导致其他所有需要锁的线程挂起,等待持有锁的线程释放锁。可见性,不保证原子性。乐观锁,不适用锁的情况下实现多线程的变量同步。性能问题在并发量较高的情况下,如果一直不成功,会一直增加的开销。

cas原理

cas全称Compare and swap,比较和交换的意思。原子操作,需要硬件的支持。
三个基本操作数:内存地址V,旧的预期值A,要修改的新值B。
举个线程A想执行相加的例子。

内存地址V有个值是1。

线程A把V的值放在A中。

线程A执行V+2,得到的3为B。

把A和V的值比较,如果不一样,重新执行2的步骤。

如果一样,把V的值替换为B。

synchronized,volatile,cas

synchronized:独占锁,会导致其他所有需要锁的线程挂起,等待持有锁的线程释放锁。

volatile:可见性,不保证原子性。

cas:乐观锁,不适用锁的情况下实现多线程的变量同步。

缺点

ABA问题:在上面例子中,如果V的值是1,被B线程变成2,再被A线程变成1,那么对于A线程来说,还是当做没有变化。解决的办法就是加版本号。

性能问题:在并发量较高的情况下,如果一直不成功,会一直增加CPU的开销。

只能保证一个共享变量的原子操作

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75351.html

相关文章

  • java并发编程习之cas-AtomicStampedReference(三)

    摘要:作用通过版本号解决的问题。示例当前值,预设当前版本号结果当前值,预设当前版本号结果当前值当前版本号运行结果如下这里用休眠,让线程和线程一次执行,通过结果可以看出来,线程执行成功,而线程执行失败。 作用 通过版本号解决ABA的问题。 示例 public class AtomicStampedReferenceDemo { static AtomicStampedReference...

    DevTalking 评论0 收藏0
  • java并发编程习之cas-AtomicInteger(二)

    摘要:示例运行结果如下在多线程无锁的情况下,总是小于等于,而因为原子性的方法总是等于。 示例 public class AtomicDemo { static int num1 = 0; static AtomicInteger num2 = new AtomicInteger(0); static class Thread1 extends Thread { ...

    warmcheng 评论0 收藏0
  • java并发编程习之cas-AtomicStampedReference(三)

    摘要:作用通过版本号解决的问题。示例当前值,预设当前版本号结果当前值,预设当前版本号结果当前值当前版本号运行结果如下这里用休眠,让线程和线程一次执行,通过结果可以看出来,线程执行成功,而线程执行失败。 作用 通过版本号解决ABA的问题。 示例 public class AtomicStampedReferenceDemo { static AtomicStampedReference...

    xiaoxiaozi 评论0 收藏0
  • java并发编程习之显示锁Lock

    摘要:显示锁和内置锁内置锁优势代码简洁不会因为没释放锁,导致锁泄露。显示锁优势灵活性强,锁的获取可以被中断,可以尝试获取锁。接口接口主要方法如下获取锁尝试获取锁,表示未加锁的情况。会进行抢锁操作,如果获取不到锁,也会进入阻塞队列等到唤醒。 显示锁和内置锁 内置锁(Synchronized)优势 代码简洁 不会因为没释放锁,导致锁泄露。 显示锁(Lock)优势 灵活性强,锁的获取可以被中...

    zone 评论0 收藏0
  • java并发编程习之AQS

    摘要:原理全称,当线程去获取资源的时候,会根据状态值来判断是否有锁,如果有锁,则加入到链表,链表里的线程,通过自旋,判断资源是否已经释放,如果释放,则获取资源。 原理 全称AbstractQueuedSynchronizer,当线程去获取资源的时候,会根据状态值state来判断是否有锁,如果有锁,则加入到链表,链表里的线程,通过自旋,判断资源是否已经释放,如果释放,则获取资源。 AQS结构 ...

    Tikitoo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<