JUC并发编程学习笔记(十九)原子引用

这篇具有很好参考价值的文章主要介绍了JUC并发编程学习笔记(十九)原子引用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原子引用

带版本号的原子操作!

解决ABA问题,引入原子引用(乐观锁思想)

AtomicStampedReference类解决ABA问题

package org.example.cas;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicStampedReference;

//使用原子引用解决ABA问题
public class ABADemo {
    public static void main(String[] args) {
        //默认值 默认版本号(时间戳)
        //如果泛型是一个包装类,注意对象引用的问题
        //正常在业务中里面比较并交换的一般是一个个对象如User这种
        AtomicStampedReference<Integer> atomic = new AtomicStampedReference<>(1,1);
        new Thread(()->{
            int stamp = atomic.getStamp();//获得版本号
            System.out.println("a1版本号=》"+stamp);
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            //atomic.compareAndSet 期待的值 更新的值 期待的版本号 更新的版本号
            //当期待的值和期待的版本号都满足期待时,就更新值和版本号
            System.out.println(atomic.compareAndSet(1, 2, stamp, stamp + 1));
            System.out.println("a2版本号=》"+atomic.getStamp());
            System.out.println(atomic.compareAndSet(2, 1, atomic.getStamp(), atomic.getStamp() + 1));
            System.out.println("a3版本号=》"+atomic.getStamp());
        },"A").start();
        //与乐观锁原理相同
        new Thread(()->{
            int stamp = atomic.getStamp();//获得版本号
            System.out.println("b1版本号=》"+stamp);
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(atomic.compareAndSet(1, 2, stamp, stamp + 1));
            System.out.println("b2版本号=》"+atomic.getStamp());
        },"B").start();
    }
}

所有相同类型的包装类对象之间值的比较全部使用equals方法比较

Integer使用了对象缓存机制,默认范围是-128至127,推荐使用静态工厂方法valueOf获取对象实例,而不是new,因为valueOf使用缓存,而new一定会创建新的对象分配新的内存空间;

说明:对于Integer var = ?在-128至127之间的赋值,Integer对象实在IntegerCache.cache产生,会复用已有对象,这个区间的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。文章来源地址https://www.toymoban.com/news/detail-749839.html

到了这里,关于JUC并发编程学习笔记(十九)原子引用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JUC并发编程之原子类

    目录 1. 什么是原子操作 1.1 原子类的作用 1.2 原子类的常见操作 原子类的使用注意事项 并发编程是现代计算机应用中不可或缺的一部分,而在并发编程中,处理共享资源的并发访问是一个重要的问题。为了避免多线程访问共享资源时出现竞态条件(Race Condition)等问题,J

    2024年02月13日
    浏览(41)
  • JUC并发编程学习笔记(十五)JMM

    请你谈谈对Volatile的理解 Volatile是java虚拟机提供的 轻量级的同步机制 1、保证可见性 2、不保证原子性 3、禁止指令重排 什么是JMM JVM-java虚拟机 JMM-java内存模型,不存在的东西,概念!约定 关于JMM的一些同步的约定: 线程解锁前,必须把共享变量 立刻 刷回主存 线程加锁前,

    2024年02月05日
    浏览(45)
  • JUC并发编程学习笔记(十六)Volatile

    保证可见性 使用了volatile,即可保证它本身可被其他线程的工作内存感知,即变化时也会被同步变化。 不保证原子性 原子性:不可分割 线程A在执行任务时是不可被打扰的,也不能被分割,要么同时成功,要么同时失败。 每次结果也不一样。 如果不加Lock加synchronize

    2024年02月05日
    浏览(94)
  • JUC并发编程学习笔记(九)阻塞队列

    阻塞 队列 队列的特性:FIFO(fist inpupt fist output)先进先出 不得不阻塞的情况 什么情况下会使用阻塞队列:多线程并发处理、线程池 学会使用队列 添加、移除 四组API 方式 抛出异常 不抛出异常,有返回值 阻塞等待 超时等待 添加 add offer put offer(E e, long timeout, TimeUnit unit) 移

    2024年02月06日
    浏览(43)
  • JUC并发编程学习笔记(八)读写锁

    ReadWriteLock ReadWriteLock只存在一个实现类那就是ReentrantReadWriteLock,他可以对锁实现更加细粒化的控制 读的时候可以有多个阅读器线程同时参与,写的时候只希望写入线程是独占的 Demo:

    2024年02月06日
    浏览(43)
  • JUC并发编程学习笔记(十四)异步回调

    Future设计的初衷:对将来的某个事件的结果进行建模 在Future类的子类中可以找到CompletableFuture,在介绍中可以看到这是为非异步的请求使用一些异步的方法来处理 点进具体实现类中,查看方法,可以看到CompletableFuture中的异步内部类,里面是实现的异步方法 以及一些异步方法

    2024年02月05日
    浏览(41)
  • JUC并发编程学习笔记(十)线程池(重点)

    线程池:三大方法、七大参数、四种拒绝策略 池化技术 程序的运行,本质:占用系统的资源!优化资源的使用!- 池化技术(线程池、连接池、对象池......);创建和销毁十分消耗资源 池化技术:事先准备好一些资源,有人要用就拿,拿完用完还给我。 线程池的好处: 1、

    2024年02月06日
    浏览(41)
  • JUC并发编程学习笔记(六)Callable(简单)

    callable接口和runnable接口类似,都是为了执行另外一条线程而设计的,区别是Runnable不会返回结果也不会抛出异常。 1、可以有返回值 2、可以抛出异常 3、方法不同;run()/call(); Runnable 实现Runnable接口,重写run方法,无返回值 Callable 实现Callable接口,重写call方法,有返回值,可

    2024年02月06日
    浏览(39)
  • JUC并发编程学习笔记(四)8锁现象

    八锁-就是关于锁的八个问题 锁是什么,如何判断锁的是谁 对象、class模板 深刻理解锁 锁的东西无外乎就两样:1、同步方法的调用者,2、Class模板。 同一个锁中,只有当前线程资源释放后才会被下一个线程所接手。 同步方法的调用者是两个不同的实例时,互不相关。 静态

    2024年02月06日
    浏览(49)
  • JUC并发编程学习笔记(十八)深入理解CAS

    什么是CAS 为什么要学CAS:大厂你必须深入研究底层!有所突破! java层面的cas-------compareAndSet compareAndSet(int expectedValue, int newValue) 期望并更新,达到期望值就更新、否则就不更新! Unsafe类 java不能直接操作内存,但是可以调用c++,c++可以操作内存,java可以通过native定义

    2024年02月05日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包