Java Atomic原理图文

简介: java Atomic原理图文

Java中的Atomic类是Java.util.concurrent包提供的一组原子操作类,这些类提供了线程安全的基本数学和逻辑运算。

image.png

image.png

Atomic原理
在多线程编程中,由于多个线程同时访问共享资源,例如变量、数据结构等,会引发线程安全问题。为了解决这些问题,Java提供了两种方式:synchronized关键字和Lock接口。
然而,在高并发场景下,使用synchronized和Lock可能会导致性能瓶颈,因为它们都需要让线程排队来获得锁。
在这种情况下,可以使用Java Atomic类,它们使用CPU级别的指令来保证操作的原子性,并且不需要使用锁机制,因此它们通常比synchronized和Lock更加高效。
Atomic类提供的操作是原子性操作,具有以下特点:
原子性:整个操作是仅有的一个原子操作,不会被其他线程干扰。
可见性:每个线程对变量的修改对其他线程可见。
有序性:程序执行的顺序按照代码的先后顺序。

技术文档
image.png

原子类型
image.png

Java Atomic类提供了以下4种原子类型:
AtomicInteger:原子整型
AtomicLong:原子长整型
AtomicBoolean:原子布尔值
AtomicReference:原子对象引用
成员方法
image.png
image.png
image.png
Atomic类的主要成员方法如下
get()和set()方法:用于获取和设置值。
addAndGet()和getAndAdd()方法:用于原子地增加或减少值,并返回新值。
compareAndSet()方法:如果当前值等于预期值,则原子地将其设置为新值,可以用于实现乐观锁。
incrementAndGet()和getAndIncrement()方法:用于原子地增加或减少值,并返回新值。
代码示例
以下是一个使用AtomicInteger类的简单示例:

import java.util.concurrent.atomic.AtomicInteger;

public class Counter {
    private final AtomicInteger count = new AtomicInteger(0);

    public int getCount() {
        return count.get();
    }

    public void increment() {
        count.incrementAndGet();
    }

    public void decrement() {
        count.decrementAndGet();
    }
}

在上面的例子中,我们创建了一个Counter类,该类使用AtomicInteger来实现线程安全的计数器。increment()和decrement()方法分别增加和减少计数器的值,由于它们使用AtomicInteger类的原子操作,因此它们对于多个线程是线程安全的。

image.png
image.png

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

public class ConcurrentHashMapWithAtomicDemo {
    private final ConcurrentHashMap<String, AtomicInteger> concurrentHashMap = new ConcurrentHashMap<>();

    public void increment(String key) {
        AtomicInteger value = concurrentHashMap.get(key);
        if (value == null) {
            AtomicInteger newValue = new AtomicInteger(1);
            value = concurrentHashMap.putIfAbsent(key, newValue);
            if (value == null) {
                value = newValue;
            }
        } else {
            value.incrementAndGet();
        }
    }

    public int getCount(String key) {
        AtomicInteger value = concurrentHashMap.get(key);
        return (value == null) ? 0 : value.get();
    }
}

在上面的示例中,我们创建了一个ConcurrentHashMapWithAtomicDemo类,该类使用ConcurrentHashMap类和AtomicInteger类来实现线程安全的计数器。increment()方法增加对给定键值的计数器,getCount()方法获取给定键值的计数器。
在increment()方法中,我们首先从ConcurrentHashMap中获取原子整数,然后检查其是否为空。如果为空,则我们创建一个新的原子整数并使用putIfAbsent()方法将其放入ConcurrentHashMap,此方法可以确保原子地将键值对添加到ConcurrentHashMap中。在这种情况下,我们将新值设为1。
如果原子整数不为空,则我们增加其计数器。
在getCount()方法中,我们从ConcurrentHashMap获取原子整数,并返回它的当前值。如果原子整数不存在,则返回0。
使用Java Atomic类结合ConcurrentHashMap类来实现线程安全的计数器,可以处理高并发环境下的计数问题。ConcurrentHashMap提供了线程安全的Hash表操作,而Atomic类可以保证对计数器的更新是原子性的。
结论
Java Atomic类提供了一组非常有用的功能,可以在高并发环境下解决线程安全问题。它们比传统的同步机制更加高效,因此可以提高程序的性能。如果你需要在多线程应用程序中处理共享变量,可以尝试使用Java Atomic类来提高程序的性能和可靠性。

目录
相关文章
|
2天前
|
监控 Java 调度
Java并发编程:线程池的原理与实践
【5月更文挑战第30天】 在现代软件开发中,尤其是Java应用中,并发编程是一个不可忽视的领域。线程池作为提升应用性能和资源利用率的关键技术之一,其正确使用和优化对系统稳定性和效率至关重要。本文将深入探讨线程池的核心原理、常见类型以及在实际开发中的使用案例,旨在帮助开发者更好地理解和运用线程池技术,构建高性能的Java应用程序。
|
2天前
|
存储 自然语言处理 Java
Java的工作原理
Java的工作原理
|
3天前
|
监控 Java 开发者
深入理解Java并发编程:线程池的工作原理与实践
【5月更文挑战第29天】 在现代Java应用开发中,高效地管理并发任务是至关重要的。本文将深入探讨Java线程池的核心机制,揭示其背后的设计哲学和运作模式。通过分析线程池的优势、工作过程及关键参数,结合实例演示如何合理配置和优化线程池以提高应用程序的性能和响应能力。
|
3天前
|
Java 开发者
Java并发编程:理解线程池的工作原理与实践应用
【5月更文挑战第29天】在Java并发编程中,线程池是一种管理线程资源的重要工具。通过深入探讨线程池的工作原理和实践应用,本文将帮助开发者更好地理解和使用线程池,提高系统性能和稳定性。
|
3天前
|
存储 Java 编译器
Java方法的基本内存原理与代码实例
Java方法的基本内存原理与代码实例
|
3天前
|
安全 Java 编译器
Java 多线程系列Ⅴ(常见锁策略+CAS+synchronized原理)
Java 多线程系列Ⅴ(常见锁策略+CAS+synchronized原理)
|
7天前
|
存储 安全 Java
Java泛型:原理、应用与深入解析
Java泛型:原理、应用与深入解析
|
7天前
|
安全 算法 Java
Java Stream API:原理、应用与深入解析
Java Stream API:原理、应用与深入解析
|
7天前
|
并行计算 安全 Java
Java Lambda表达式:原理、应用与深入解析
Java Lambda表达式:原理、应用与深入解析
|
8天前
|
安全 Java 开发者
谈谈Java线程同步原理
【5月更文挑战第24天】Java 线程同步的原理主要基于两个核心概念:互斥(Mutual Exclusion)和可见性(Visibility)。
11 3