资讯专栏INFORMATION COLUMN

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

xiaoxiaozi / 2446人阅读

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

作用

通过版本号解决ABA的问题。

示例
public class AtomicStampedReferenceDemo {
    static AtomicStampedReference stampedReference = new AtomicStampedReference<>(1, 1);

    public static void main(String[] args) throws InterruptedException {
        int oldStamp = stampedReference.getStamp();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                boolean result = stampedReference.compareAndSet(1, 2, oldStamp, oldStamp + 1);
                System.out.println("当前值:1,预设2,当前版本号:" + stampedReference.getStamp() + ",结果:" + result);
            }
        });
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                boolean result = stampedReference.compareAndSet(2, 3, oldStamp, oldStamp + 1);
                System.out.println("当前值:2,预设3,当前版本号:" + stampedReference.getStamp() + ",结果:" + result);
            }
        });
        thread1.start();
        thread2.start();
        Thread.sleep(2000);
        System.out.println("当前值:" + stampedReference.getReference() + ",当前版本号:" + stampedReference.getStamp());
    }
}

运行结果如下:

这里用休眠,让线程1和线程2一次执行,通过结果可以看出来,线程1执行成功,而线程2执行失败。原因就是因为版本号对不上。

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

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

相关文章

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

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

    DevTalking 评论0 收藏0
  • java并发编程习之线程池-ThreadPoolExecutor()

    摘要:是所有线程池实现的父类,我们先看看构造函数构造参数线程核心数最大线程数线程空闲后,存活的时间,只有线程数大于的时候生效存活时间的单位任务的阻塞队列创建线程的工程,给线程起名字当线程池满了,选择新加入的任务应该使用什么策略,比如抛异常丢弃当前 ThreadPoolExecutor ThreadPoolExecutor是所有线程池实现的父类,我们先看看构造函数 构造参数 corePool...

    阿罗 评论0 收藏0
  • java并发编程习之线程的生命周期-yield(

    摘要:方法作用让当前的线程状态从运行状态转到就绪状态,然后和其他就绪状态的同相同优先级的其他线程竞争的执行权。也就是说,这个线程,还是有机会继续再次执行的。 方法作用 让当前的线程状态从运行状态转到就绪状态,然后和其他就绪状态的同相同优先级的其他线程竞争CPU的执行权。也就是说,这个线程,还是有机会继续再次执行的。 优先权 优先级范围是1~10,数字越大,优先级越高,默认为5,但是由于操作系...

    Barry_Ng 评论0 收藏0
  • java并发编程习之种线程启动方式

    摘要:类这是方式启动的运行结果如下接口这是方式启动的运行结果如下接口运行结果如下接口和接口的区别可以有返回值。通过包装成,传递给,因为是实现了接口。 类Thread public class ThreadDemo extends Thread { public static void main(String[] args) { ThreadDemo thread = ...

    enrecul101 评论0 收藏0
  • java并发编程习之FutureTask

    摘要:在并发编程学习之三种线程启动方式中有提过。是否执行结束,包括正常执行结束或异常结束。获取返回值,没有得到返回值前一直阻塞。运行结果如下由于任务被取消,所以抛出异常。注意的是,此时线程还在跑,和返回的是。并不能让任务真正的结束。 FutureTask 在java并发编程学习之三种线程启动方式中有提过。主要的方法如下: cancel(boolean mayInterruptIfRunni...

    BothEyes1993 评论0 收藏0

发表评论

0条评论

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