• 16. 原子类


    原子类也是 JUC 包下的:java.util.concurrent.atomic
    包含四个原子类:

    • AtomicInteger
    • AtomicLong
    • AtomicBoolean
    • AtomicRefence

    Atomic

    Atomic 的四个类型

    • 基本数据类型
    • 数组类型
    • 引用类型
    • 对象的属性修改类型

    原子引用

    解决 ABA 问题,引入原子引用,对应的引用:乐观锁

    问题描述:

    两个线程同时调用同一个共享信息,某一个执行完一次修改了原值,之后再修改为初始值,此时 其他线程不知道该共享值已经被修改过了,不是原先的值。

    package pers.vincent.matrix.subject.atomic;
    
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.atomic.AtomicStampedReference;
    
    public class AtomicDemo {
        public static void main(String[] args) {
    
            AtomicStampedReference<Integer> atomicStampedReference = new AtomicStampedReference(7, 1);
    
    
            new Thread(() -> {
                int stam = atomicStampedReference.getStamp();
    
                System.out.println("A线程第一个版本号:" + stam);
    
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                atomicStampedReference.compareAndSet(7, 8, atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1);
    
                System.out.println("A1==" + atomicStampedReference.getStamp());
    
                atomicStampedReference.compareAndSet(8, 7, atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1);
    
                System.out.println("A2==" + atomicStampedReference.getStamp());
            }, "A").start();
    
            new Thread(() -> {
                int stam = atomicStampedReference.getStamp();
    
                System.out.println("B线程第一个版本号:" + stam);
    
                try {
                    TimeUnit.SECONDS.sleep(3);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                System.out.println(atomicStampedReference.compareAndSet(7, 8, stam, stam + 1));
    
                System.out.println("B线程第二个版本号:" + atomicStampedReference.getStamp());
            }, "B").start();
    
    
        }
    }
    
  • 相关阅读:
    漫谈怎样学习操作系统原理
    二分图的最大匹配、完美匹配和匈牙利算法
    Web报表工具FineReport中JavaScript的使用
    Java Web -- Servlet(1) 必备知识
    xxxxxxclub系统模块分类
    经典排序算法——选择排序
    github+hexo+node.js搭建个人博客基本过程及遇到的问题
    自己做小项目的流程(慢慢完善)
    二分查找
    Eclipse中遇到The type XXX cannot be resolved. It is indirectly referenced from required .class files错误
  • 原文地址:https://www.cnblogs.com/blackBlog/p/13451618.html
Copyright © 2020-2023  润新知