摘要:线程把的值放在中。线程执行,得到的为。,,独占锁,会导致其他所有需要锁的线程挂起,等待持有锁的线程释放锁。可见性,不保证原子性。乐观锁,不适用锁的情况下实现多线程的变量同步。性能问题在并发量较高的情况下,如果一直不成功,会一直增加的开销。
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,cassynchronized:独占锁,会导致其他所有需要锁的线程挂起,等待持有锁的线程释放锁。
volatile:可见性,不保证原子性。
cas:乐观锁,不适用锁的情况下实现多线程的变量同步。
缺点ABA问题:在上面例子中,如果V的值是1,被B线程变成2,再被A线程变成1,那么对于A线程来说,还是当做没有变化。解决的办法就是加版本号。
性能问题:在并发量较高的情况下,如果一直不成功,会一直增加CPU的开销。
只能保证一个共享变量的原子操作
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75351.html
摘要:作用通过版本号解决的问题。示例当前值,预设当前版本号结果当前值,预设当前版本号结果当前值当前版本号运行结果如下这里用休眠,让线程和线程一次执行,通过结果可以看出来,线程执行成功,而线程执行失败。 作用 通过版本号解决ABA的问题。 示例 public class AtomicStampedReferenceDemo { static AtomicStampedReference...
摘要:示例运行结果如下在多线程无锁的情况下,总是小于等于,而因为原子性的方法总是等于。 示例 public class AtomicDemo { static int num1 = 0; static AtomicInteger num2 = new AtomicInteger(0); static class Thread1 extends Thread { ...
摘要:作用通过版本号解决的问题。示例当前值,预设当前版本号结果当前值,预设当前版本号结果当前值当前版本号运行结果如下这里用休眠,让线程和线程一次执行,通过结果可以看出来,线程执行成功,而线程执行失败。 作用 通过版本号解决ABA的问题。 示例 public class AtomicStampedReferenceDemo { static AtomicStampedReference...
摘要:显示锁和内置锁内置锁优势代码简洁不会因为没释放锁,导致锁泄露。显示锁优势灵活性强,锁的获取可以被中断,可以尝试获取锁。接口接口主要方法如下获取锁尝试获取锁,表示未加锁的情况。会进行抢锁操作,如果获取不到锁,也会进入阻塞队列等到唤醒。 显示锁和内置锁 内置锁(Synchronized)优势 代码简洁 不会因为没释放锁,导致锁泄露。 显示锁(Lock)优势 灵活性强,锁的获取可以被中...
摘要:原理全称,当线程去获取资源的时候,会根据状态值来判断是否有锁,如果有锁,则加入到链表,链表里的线程,通过自旋,判断资源是否已经释放,如果释放,则获取资源。 原理 全称AbstractQueuedSynchronizer,当线程去获取资源的时候,会根据状态值state来判断是否有锁,如果有锁,则加入到链表,链表里的线程,通过自旋,判断资源是否已经释放,如果释放,则获取资源。 AQS结构 ...
阅读 3692·2023-04-25 17:45
阅读 3349·2021-09-04 16:40
阅读 982·2019-08-30 13:54
阅读 2103·2019-08-29 12:59
阅读 1375·2019-08-26 12:11
阅读 3257·2019-08-23 15:17
阅读 1490·2019-08-23 12:07
阅读 3851·2019-08-22 18:00