• 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();
    
    
        }
    }
    
  • 相关阅读:
    Scala入门基础1
    LitePal数据库的基本操作
    Android操作SQLate数据库
    Android广播的使用(自定义广播和本地广播)
    Android广播的使用(动态注册和静态注册)
    Android碎片的使用
    linux--硬链接与软连接
    linux下python环境的搭建
    系统时间的修改
    linux命令--文件和目录管理
  • 原文地址:https://www.cnblogs.com/blackBlog/p/13451618.html
Copyright © 2020-2023  润新知