37.并发编程之LongAdder介绍

[TOC]一、原子累加器对比我们通过如下代码,比较synchronized、AtomicInteger、AtomicLong、LongAdder、LongAccumulator五种计数性能。示例需求:热点商品点赞计算器,点赞数进行统计,不要求实时精确。50个线程,每个线程100W次,统计总点赞数。import java.util.concurrent.CountDownLatch; impo...

Java 2022-11-09 PM 906次 0条

36.并发编程之字段更新器

[TOC]一、概述前面所讲的几个原子更新引用类型如:AtomicReference,用于整个对象的更新。但不是每次都必须更新整个对象,有可能我们只需对对象中的某个字段进行原子性修改时,那么就需要使用原子更新字段类。在java.util.concurrent.atomic中,原子类型字段更新器有以下三种:AtomicIntegerFieldUpdater:基于反射的工具类,可以原子性的更新指定...

Java 2022-11-08 PM 1217次 0条

35.并发编程之原子数组

[TOC]一、数组类型的原子类原子数组类型,这个其实和AtomicInteger等类似,只不过在修改时需要指明数组下标。CAS是按照==来根据地址进行比较。数组比较地址,肯定是不行的,只能比较下标元素。而比较下标元素,就和元素的类型有关系了。在java.util.concurrent.atomic中,原子类型数组有以下四种:类名说明AtomicIntegerArray提供对int[]数组元素...

Java 2022-11-07 PM 1141次 0条

34.并发编程之原子引用

[TOC]一、概述为什么需要原子引用类型?保证引用类型的共享变量是线程安全的。基本类型原子类只能更新一个变量,如果需要原子更新多个变量,需要使用引用类型原子类。AtomicReference:引用类型原子类;AtomicStampedRerence:原子更新带有版本号的引用类型;该类将整数值与引用关联起来,可用于解决原子的更新数据和数据的版本号,可以解决使用 CAS 进行原子更新时可能出现的...

Java 2022-11-06 PM 1225次 0条

33.AtomicInteger原子整数

[TOC]前言AtomicInteger 类底层存储一个int值,并提供方法对该int值进行原子操作。AtomicInteger 作为java.util.concurrent.atomic包的一部分,从Java 1.5开始引入。接下来我们先从三个问题入手,对AtomicInteger概念有一个基本的了解。一、概述(1)什么是原子操作呢?所谓原子操作,就是一个独立且不可分割的操作。Atomic...

Java 2022-11-05 PM 1349次 0条

32.共享模型之CAS与volatile

[TOC]一、案例分析前面看到的 AtomicInteger 的解决方法,内部并没有用锁来保护共享变量的线程安全。那么它是如何实现的呢?public void withdraw(Integer amount) { // 需要不断尝试,直到成功为止 while (true) { // 比如拿到了旧值 1000 ...

Java 2022-11-03 PM 1156次 0条

31.共享模型之无锁问题提出

[TOC]一、引述需求:保证多线程情况下 account.withdraw 取款方法的线程安全import java.util.ArrayList; import java.util.List; /** * @author lilinchao * @date 2022-11-03 * @description 取款方法 **/ public interface Account { ...

Java 2022-11-03 PM 851次 0条

30.并发编程之单例模式安全习题

[TOC]一、balking模式习题希望 doInit() 方法仅被调用一次,下面的实现是否有问题,为什么?public class TestVolatile { volatile boolean initialized = false; void init() { if (initialized) { return...

Java 2022-11-02 PM 1154次 0条

29.并发编程之happens-before规则

[TOC]前言Happens-Before规则主要有两个作用:一是解决数据竞争问题;二是为开发人员提供足够强的内存可见性。一、概述1.1 数据竞争数据竞争就是指并发条件下的状态属性不同步而引发的读写不一致问题。现假设有两个线程A、B要对内存中的同一个变量进行访问,线程A要对这个变量执行写操作,线程B要对这个变量执行读操作,两个操作是同时进行的,此时若不加以限制,线程B读操作所得到的结果就有两...

Java 2022-11-02 PM 910次 0条

28.并发编程之DCL问题

[TOC]一、概述定义:如果一个类始终只能创建一个实例,那么这个类被称为单例类,这种设计模式被称为单例模式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。更详细的可以看之前推送的文章...

Java 2022-11-01 PM 1167次 0条