Juc15_基本AtomicInteger、数组、引用AtomicStampedReference、对象的属性修改原子类AtomicIntegerFieldUp 、原子操作增强类LongAdder(一)

简介: ①. atomic是什么?②. 基本类型原子类(AtomicInteger、AtomicBoolean、AtomicLong)

①. atomic是什么?


  • ①. atomic是原子类,主要有如下:


微信图片_20220108131022.png


②. Java开发手册中说明:


微信图片_20220108131058.png



②. 基本类型原子类(AtomicInteger、AtomicBoolean、AtomicLong)


  • ①. 常用API简介


捕获.PNG


②. AtomicInteger解决 i++ 多线程下不安全问题


CountDownLatch如何在程序中使用


public class AtomicIntegerDemo {
    AtomicInteger atomicInteger=new AtomicInteger(0);
    public void addPlusPlus(){
        atomicInteger.incrementAndGet();
    }
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch=new CountDownLatch(10);
        AtomicIntegerDemo atomic=new AtomicIntegerDemo();
        // 10个线程进行循环100次调用addPlusPlus的操作,最终结果是10*100=1000
        for (int i = 1; i <= 10; i++) {
            new Thread(()->{
               try{
                   for (int j = 1; j <= 100; j++) {
                       atomic.addPlusPlus();
                   }
               }finally {
                   countDownLatch.countDown();
               }
            },String.valueOf(i)).start();
        }
        //(1). 如果不加上下面的停顿3秒的时间,会导致还没有进行i++ 1000次main线程就已经结束了
        //try { TimeUnit.SECONDS.sleep(3);  } catch (InterruptedException e) {e.printStackTrace();}
        //(2). 使用CountDownLatch去解决等待时间的问题
        countDownLatch.await();
        System.out.println(Thread.currentThread().getName()+"\t"+"获取到的result:"+atomic.atomicInteger.get());
    }
}


③. AtomicBoolean可以作为中断标识停止线程的方式


//线程中断机制的实现方法
public class AtomicBooleanDemo {
    public static void main(String[] args) {
        AtomicBoolean atomicBoolean=new AtomicBoolean(false);
        new Thread(()->{
            System.out.println(Thread.currentThread().getName()+"\t"+"coming.....");
            while(!atomicBoolean.get()){
                System.out.println("==========");
            }
            System.out.println(Thread.currentThread().getName()+"\t"+"over.....");
        },"A").start();
        new Thread(()->{
            atomicBoolean.set(true);
        },"B").start();
    }
}


④. AtomicLong的底层是CAS+自旋锁的思想,适用于低并发的全局计算,高并发后性能急剧下降,原因如下:N个线程CAS操作修改线程的值,每次只有一个成功过,其他N-1失败,失败的不停的自旋直到成功,这样大量失败自旋的情况,一下子cpu就打高了(AtomicLong的自旋会成为瓶颈)


在高并发的情况下,我们使用LoadAdder


相关文章
|
10月前
|
安全 Java API
原子类型AtomicLong用法探究
AtomicLong 是 Java 提供的一个原子长整型类,提供了对长整型数据的原子性操作。在多线程环境下,AtomicLong 可以确保对长整型数据的操作是线程安全的。
127 0
|
12天前
|
Java 索引
JUC中的原子操作类及其原理
JUC中的原子操作类及其原理
|
2月前
|
缓存 安全 算法
Java并发基础:原子类之AtomicInteger全面解析
【2月更文挑战第2天】AtomicInteger类提供了线程安全的整数操作,它通过利用底层硬件的原子性指令,能够在多线程环境中高效地实现整数的无锁更新,避免了传统同步机制带来的性能开销,在高并发场景下成为计数器可大幅提高程序的执行效率,同时又保证了数据一致性。
97 16
Java并发基础:原子类之AtomicInteger全面解析
|
2月前
|
存储 安全
除了Lock对象,还有其他方法可以实现多线程安全的单例模式吗?
【2月更文挑战第5天】【2月更文挑战第12篇】除了Lock对象,还有其他方法可以实现多线程安全的单例模式吗?
|
9月前
|
监控 安全 Java
自旋锁的伪代码实现,CAS的ABA问题,JUC常见类:Callable,ReentrantLock,线程创建方法的总结,信号量,原子类的应用场景,特定场所的组件CountDomLatch,针对集合类的
自旋锁的伪代码实现,CAS的ABA问题,JUC常见类:Callable,ReentrantLock,线程创建方法的总结,信号量,原子类的应用场景,特定场所的组件CountDomLatch,针对集合类的
|
12月前
|
安全 Java API
原子操作类解读
原子操作类解读
原子操作类解读
|
11月前
|
算法 Java
第二季:3原子类AtomicInteger的ABA问题谈谈?原子更新引用知道吗?【Java面试题】
第二季:3原子类AtomicInteger的ABA问题谈谈?原子更新引用知道吗?【Java面试题】
81 0
|
12月前
|
安全 Java
变量的线程安全分析
变量的线程安全分析
|
12月前
|
安全 Java
常用的线程安全的类有哪些
Java并发包(java.util.concurrent)中还提供了更多的线程安全类和工具,如Semaphore、CountDownLatch、CyclicBarrier、ReadWriteLock等,可以根据具体的需求进一步选择。在并发编程中,正确使用和理解这些线程安全的类和工具是非常重要的,能够有效地提高程序的并发性能和安全性
495 0
|
安全 Java 编译器
多线程安全问题原理和解决办法Synchronized和ReentrantLock使用与区别
多线程安全问题原理和解决办法Synchronized和ReentrantLock使用与区别