legongju.com
我们一直在努力
2025-01-13 03:31 | 星期一

java putifabsent案例有哪些

在Java中,putIfAbsent方法是ConcurrentHashMap类的一个方法,它用于在映射中插入一个键值对,但只有当该键不存在时。如果键已经存在,则不会进行任何操作,并返回与给定键关联的现有值。这个方法在多线程环境下非常有用,因为它可以确保线程安全地添加或更新映射中的元素。

以下是一些使用putIfAbsent方法的案例:

  1. 缓存实现: 使用ConcurrentHashMapputIfAbsent可以实现一个简单的缓存。当需要获取某个数据时,首先检查缓存中是否存在该数据。如果存在,则直接返回;如果不存在,则从数据源(如数据库)获取数据,并将其添加到缓存中。

    public class Cache {
        private final ConcurrentHashMap cache = new ConcurrentHashMap<>();
    
        public V get(K key) {
            return cache.computeIfAbsent(key, k -> fetchFromDataSource(k));
        }
    
        private V fetchFromDataSource(K key) {
            // 从数据源获取数据的逻辑
            return null;
        }
    }
    
  2. 计数器: 可以使用putIfAbsent方法实现一个线程安全的计数器。当需要增加计数器的值时,使用putIfAbsent方法确保同一时间只有一个线程能够更新计数器的值。

    public class Counter {
        private final ConcurrentHashMap counterMap = new ConcurrentHashMap<>();
    
        public void increment(String key) {
            counterMap.compute(key, (k, v) -> v == null ? 1 : v + 1);
        }
    
        public int getCount(String key) {
            return counterMap.getOrDefault(key, 0);
        }
    }
    
  3. 分布式锁: 在分布式系统中,可以使用putIfAbsent方法实现一个简单的分布式锁。当一个节点需要获取锁时,它会尝试使用putIfAbsent方法在共享映射中插入一个锁标记。如果插入成功,则该节点获得了锁;否则,说明其他节点已经持有锁,当前节点需要等待。

    public class DistributedLock {
        private final ConcurrentHashMap lockMap = new ConcurrentHashMap<>();
    
        public boolean tryLock(String lockKey) {
            String existingLock = lockMap.putIfAbsent(lockKey, lockKey);
            return existingLock == null;
        }
    
        public void unlock(String lockKey) {
            lockMap.remove(lockKey);
        }
    }
    
  4. 单例模式: 使用putIfAbsent方法可以实现线程安全的懒汉式单例模式。当需要获取单例对象时,首先检查映射中是否已经存在该对象。如果不存在,则创建一个新对象并将其添加到映射中;如果存在,则直接返回已有的对象。

    public class Singleton {
        private static final ConcurrentHashMap instances = new ConcurrentHashMap<>();
    
        private Singleton() {}
    
        public static Singleton getInstance(String key) {
            return instances.computeIfAbsent(key, k -> new Singleton());
        }
    }
    

这些案例展示了putIfAbsent方法在不同场景下的应用,可以帮助你更好地理解和使用这个方法。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/5517.html

相关推荐

  • Java中的Context有哪些类型

    Java中的Context有哪些类型

    在Java中,Context通常用于表示一个上下文或环境,其具体实现和应用场景取决于所使用的框架或库。以下是一些常见的Java中的Context类型: ServletContext:在Jav...

  • Java Context的作用是什么

    Java Context的作用是什么

    Java中的Context通常指代一个上下文对象,它在不同场景和框架中有着不同的作用。以下是一些常见场景中Context的作用: Android开发中的Context: 在Android开发中...

  • 如何在Java中使用Context

    如何在Java中使用Context

    在Java中,Context通常是指上下文,它提供了一些信息或环境,以便在程序运行时能够正确地执行某些操作 Servlet Context:在Java Web应用程序中,Servlet Context...

  • Java中Context是什么

    Java中Context是什么

    在Java中,Context通常指的是一个包含信息或数据的对象,这些信息或数据可以在程序运行时被访问和操作。Context可以用于存储和传递应用程序的状态、配置信息、用...

  • php floatval适用于什么情况

    php floatval适用于什么情况

    floatval() 是 PHP 中的一个内置函数,用于将一个变量或表达式的值转换为浮点数。这个函数适用于以下情况: 当您需要将字符串或其他类型的值转换为浮点数时。例如...

  • php floatval能精确计算吗

    php floatval能精确计算吗

    PHP的floatval()函数用于获取变量的浮点数值,它可以处理大多数情况下的浮点数计算。然而,由于浮点数在计算机中的表示和存储方式,floatval()并不能保证在所有情...

  • php floatval怎样避免精度失真

    php floatval怎样避免精度失真

    在PHP中,使用floatval()函数可以将一个字符串或数字转换为浮点数。然而,浮点数在计算机中的表示和计算可能会导致精度失真。为了避免这种情况,你可以使用以下方...

  • php floatval如何有效转换

    php floatval如何有效转换

    floatval() 是 PHP 中的一个内置函数,用于将字符串转换为浮点数。要有效转换,请按照以下步骤操作: 确保输入字符串是一个有效的浮点数表示。浮点数可以是整数、...