java putifabsent案例有哪些

小樊
81
2024-11-18 15:39:19

在Java中,putIfAbsent方法是ConcurrentHashMap類(lèi)的一個(gè)方法,它用于在映射中插入一個(gè)鍵值對(duì),但只有當(dāng)該鍵不存在時(shí)。如果鍵已經(jīng)存在,則不會(huì)進(jìn)行任何操作,并返回與給定鍵關(guān)聯(lián)的現(xiàn)有值。這個(gè)方法在多線程環(huán)境下非常有用,因?yàn)樗梢源_保線程安全地添加或更新映射中的元素。

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

  1. 緩存實(shí)現(xiàn): 使用ConcurrentHashMapputIfAbsent可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的緩存。當(dāng)需要獲取某個(gè)數(shù)據(jù)時(shí),首先檢查緩存中是否存在該數(shù)據(jù)。如果存在,則直接返回;如果不存在,則從數(shù)據(jù)源(如數(shù)據(jù)庫(kù))獲取數(shù)據(jù),并將其添加到緩存中。

    public class Cache<K, V> {
        private final ConcurrentHashMap<K, V> cache = new ConcurrentHashMap<>();
    
        public V get(K key) {
            return cache.computeIfAbsent(key, k -> fetchFromDataSource(k));
        }
    
        private V fetchFromDataSource(K key) {
            // 從數(shù)據(jù)源獲取數(shù)據(jù)的邏輯
            return null;
        }
    }
    
  2. 計(jì)數(shù)器: 可以使用putIfAbsent方法實(shí)現(xiàn)一個(gè)線程安全的計(jì)數(shù)器。當(dāng)需要增加計(jì)數(shù)器的值時(shí),使用putIfAbsent方法確保同一時(shí)間只有一個(gè)線程能夠更新計(jì)數(shù)器的值。

    public class Counter {
        private final ConcurrentHashMap<String, Integer> 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. 分布式鎖: 在分布式系統(tǒng)中,可以使用putIfAbsent方法實(shí)現(xiàn)一個(gè)簡(jiǎn)單的分布式鎖。當(dāng)一個(gè)節(jié)點(diǎn)需要獲取鎖時(shí),它會(huì)嘗試使用putIfAbsent方法在共享映射中插入一個(gè)鎖標(biāo)記。如果插入成功,則該節(jié)點(diǎn)獲得了鎖;否則,說(shuō)明其他節(jié)點(diǎn)已經(jīng)持有鎖,當(dāng)前節(jié)點(diǎn)需要等待。

    public class DistributedLock {
        private final ConcurrentHashMap<String, String> 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方法可以實(shí)現(xiàn)線程安全的懶漢式單例模式。當(dāng)需要獲取單例對(duì)象時(shí),首先檢查映射中是否已經(jīng)存在該對(duì)象。如果不存在,則創(chuàng)建一個(gè)新對(duì)象并將其添加到映射中;如果存在,則直接返回已有的對(duì)象。

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

這些案例展示了putIfAbsent方法在不同場(chǎng)景下的應(yīng)用,可以幫助你更好地理解和使用這個(gè)方法。

0