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类来提高程序的性能和可靠性。

目录
相关文章
|
7月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
226 0
|
7月前
|
存储 缓存 安全
深入讲解 Java 并发编程核心原理与应用案例
本教程全面讲解Java并发编程,涵盖并发基础、线程安全、同步机制、并发工具类、线程池及实际应用案例,助你掌握多线程开发核心技术,提升程序性能与响应能力。
304 0
|
7月前
|
人工智能 安全 Java
Go与Java泛型原理简介
本文介绍了Go与Java泛型的实现原理。Go通过单态化为不同类型生成函数副本,提升运行效率;而Java则采用类型擦除,将泛型转为Object类型处理,保持兼容性但牺牲部分类型安全。两种机制各有优劣,适用于不同场景。
282 24
|
8月前
|
存储 缓存 Java
我们来详细讲一讲 Java NIO 底层原理
我是小假 期待与你的下一次相遇 ~
281 2
|
8月前
|
XML JSON Java
Java 反射:从原理到实战的全面解析与应用指南
本文深度解析Java反射机制,从原理到实战应用全覆盖。首先讲解反射的概念与核心原理,包括类加载过程和`Class`对象的作用;接着详细分析反射的核心API用法,如`Class`、`Constructor`、`Method`和`Field`的操作方法;最后通过动态代理和注解驱动配置解析等实战场景,帮助读者掌握反射技术的实际应用。内容翔实,适合希望深入理解Java反射机制的开发者。
728 13
|
8月前
|
算法 Java 索引
说一说 Java 并发队列原理剖析
我是小假 期待与你的下一次相遇 ~
|
8月前
|
安全 Java 编译器
JD-GUI,java反编译工具及原理: JavaDecompiler一个Java反编译器
Java Decompiler (JD-GUI) 是一款由 Pavel Kouznetsov 开发的图形化 Java 反编译工具,支持 Windows、Linux 和 Mac Os。它能将 `.class` 文件反编译为 Java 源代码,支持多文件标签浏览、高亮显示,并兼容 Java 5 及以上版本。JD-GUI 支持对整个 Jar 文件进行反编译,可跳转源码,适用于多种 JDK 和编译器。其原理基于将字节码转换为抽象语法树 (AST),再通过反编译生成代码。尽管程序可能带来安全风险,但可通过代码混淆降低可读性。最新版修复了多项识别错误并优化了内存管理。
6356 1
|
8月前
|
存储 算法 安全
Java中的对称加密算法的原理与实现
本文详细解析了Java中三种常用对称加密算法(AES、DES、3DES)的实现原理及应用。对称加密使用相同密钥进行加解密,适合数据安全传输与存储。AES作为现代标准,支持128/192/256位密钥,安全性高;DES采用56位密钥,现已不够安全;3DES通过三重加密增强安全性,但性能较低。文章提供了各算法的具体Java代码示例,便于快速上手实现加密解密操作,帮助用户根据需求选择合适的加密方案保护数据安全。
550 58