小编Edd*_*die的帖子

Java 8 ConcurrentHashMap

我发现ConcurrentHashMap已经在Java 8中被完全重写为更"无锁".我浏览了该get()方法的代码,发现没有明确的锁机制:

public V get(Object key) {
    Node<K,V>[] tab; Node<K,V> e, p; int n, eh; K ek;
    int h = spread(key.hashCode());
    if ((tab = table) != null && (n = tab.length) > 0 &&
        (e = tabAt(tab, (n - 1) & h)) != null) {
        if ((eh = e.hash) == h) {
            if ((ek = e.key) == key || (ek != null && key.equals(ek)))
                return e.val;
        }
        else if (eh < 0)
            return (p = e.find(h, key)) != …
Run Code Online (Sandbox Code Playgroud)

java concurrency

19
推荐指数
2
解决办法
2417
查看次数

Java 9 反应式流。为什么需要处理器?

我在 Java 中看到了反应式流概念,它倾向于标准化 javaRX 和 Spring 反应式概念。一切都很好,除了以下事实:为了对流进行一些转换,您需要实现一个或多个处理器。我的问题是关于扩展订阅者、发布者的处理器接口处理器的需求
似乎您在进行转换时传递了一个乐趣,并将其耦合到生产者和订阅者,就是这样!但出现了一些问题:

  1. 您如何处理来自客户端/订阅者的背压。如果客户要求 10 个元素,您不知道处理器中需要多少个元素,您应该进一步向生产者询问多少个元素。我见过要求 1 或 Int.MAX 元素的示例
  2. 这有什么毛病?因为根据我的观察,它只是在进行转换时带来了乐趣,乐趣被传递给构造函数,稍后当项目流经它时调用它(就是这样)。那么我们不能直接在生产者或订阅者中实现这一点吗?(我知道你想要关注点分离,但你可以消除问题1)

您可以在这里看到一个基本示例:https://www.concretepage.com/java/java-9/java-reactive-streams。在处理器方法 onNext 中,您可以看到处理器请求 1 个元素,这让我很困扰:订阅者端的背压怎么样?如果订阅者批量请求一次 100 个元素怎么办?处理器难道不应该只关注处理方面而不应该要求元素吗?

@Override
public void onNext(Article item) {
    subscription.request(1);
    submit(function.apply(item));
}
Run Code Online (Sandbox Code Playgroud)

谢谢 !

java-9 reactive

5
推荐指数
0
解决办法
190
查看次数

标签 统计

concurrency ×1

java ×1

java-9 ×1

reactive ×1