前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java Atomic原理图文

java Atomic原理图文

原创
作者头像
疯狂的KK
发布2023-04-19 15:08:06
9100
发布2023-04-19 15:08:06
举报
文章被收录于专栏:Java项目实战Java项目实战

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

Atomic原理

在多线程编程中,由于多个线程同时访问共享资源,例如变量、数据结构等,会引发线程安全问题。为了解决这些问题,Java提供了两种方式:synchronized关键字和Lock接口。

然而,在高并发场景下,使用synchronized和Lock可能会导致性能瓶颈,因为它们都需要让线程排队来获得锁。

在这种情况下,可以使用Java Atomic类,它们使用CPU级别的指令来保证操作的原子性,并且不需要使用锁机制,因此它们通常比synchronized和Lock更加高效。

Atomic类提供的操作是原子性操作,具有以下特点:

  • 原子性:整个操作是仅有的一个原子操作,不会被其他线程干扰。
  • 可见性:每个线程对变量的修改对其他线程可见。
  • 有序性:程序执行的顺序按照代码的先后顺序。

技术文档

原子类型

Java Atomic类提供了以下4种原子类型:

  • AtomicInteger:原子整型
  • AtomicLong:原子长整型
  • AtomicBoolean:原子布尔值
  • AtomicReference:原子对象引用

成员方法

Atomic类的主要成员方法如下:

  • get()和set()方法:用于获取和设置值。
  • addAndGet()和getAndAdd()方法:用于原子地增加或减少值,并返回新值。
  • compareAndSet()方法:如果当前值等于预期值,则原子地将其设置为新值,可以用于实现乐观锁。
  • incrementAndGet()和getAndIncrement()方法:用于原子地增加或减少值,并返回新值。

代码示例

以下是一个使用AtomicInteger类的简单示例:

代码语言:javascript
复制
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类的原子操作,因此它们对于多个线程是线程安全的。

代码语言:javascript
复制
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类来提高程序的性能和可靠性。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Atomic原理
  • 技术文档
    • 原子类型
      • 成员方法
      • 代码示例
      • 结论
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档