併發LinkedHashSet

banq發表於2022-01-15

  LinkedHashSet 是一個也可以保持有序的集合。為了使這個執行緒安全,我們可以用 Collections.synchronizedSet() 包裝它。然而,這不是一個好的選擇,因為迭代仍然會很快失敗。我們不能迭代的執行緒安全的 LinkedHashSet 有什麼意義呢?
在本期通訊中,我們嘗試建立一個行為類似於 LinkedHashSet 的併發集合,但具有最少的鎖定和弱一致性迭代。

// Maven: eu.javaspecialists.books.dynamicproxies:core:2.0.0
import eu.javaspecialists.books.dynamicproxies.*;

import java.util.*;

public class DynamicProxiesDemo {
  public static void main(String... args) {
    Set<String> angrySet = Proxies.castProxy(
        Set.class,
        (p, m, a) -> {
          throw new UnsupportedOperationException(
              m.getName() + "() not implemented");
        }
    );

    Set<String> set = Proxies.adapt(
        Set.class, // target interface
        angrySet, // adaptee
        new ConcurrentLinkedReducedHashSet<>() // adapter
    );
    set.add("hello");
    set.add("world");
    Iterator<String> it = set.iterator();
    set.add("Goodbye");
    while (it.hasNext()) {
      String next = it.next();
      System.out.println(next);
    }
    set.clear();
    set.addAll(List.of("one")); // UnsupportedOperationException
  }
}    
這
不能保證這將有多快,也不能保證它是否有效。我很高興看到使用標準 JDK 類的更好解決方案。
詳細點選標題見原文

banq:建議使用chronicle queue或disruptor:前者使用磁碟檔案作為兩個執行緒共享,後者使用記憶體環形作為兩個執行緒共享

相關文章