繁体   English   中英

添加第一个元素或删除最后一个元素时触发事件的设置

[英]Set that fires event when first element is added, or last one is removed

我有一个允许用户监听网络事件的 API。 我想在添加第一个事件侦听器时启动网络连接,并在删除最后一个侦听器时断开连接。

属性:

  • 一组(监听器)的读取频率远高于写入频率。
  • 我需要能够从多个线程同时修改和读取该集合。
  • 我需要在添加第一个元素(连接到网络)和删除最后一个元素(与网络断开连接)时触发一个事件。

到目前为止我看过的内容:

  • CopyOnWriteArraySet :线程安全集,针对读取比写入进行了优化。 添加第一个元素或删除最后一个元素时,没有运行操作的机制。
  • Phaser :当最后一个元素被移除时触发一个事件,但在第一个元素被添加时不会触发。 我想我可以使用两个Phasers来实现这种行为,但这似乎很浪费。

也许ReadWriteLock对你有好处?

ReadWriteLock 维护一对关联的锁,一个用于只读操作,一个用于写入。 只要没有写者,读锁就可以被多个读者线程同时持有。 写锁是独占的。

简单示例(我使用 hashmap 代替 set):

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class LockWrapper {

private final ReadWriteLock readWriteLock;
private final Map<Integer, Object> map;
private final EventSender sender;

public LockWrapper(EventSender eventSender) {
    map = new HashMap<>();
    readWriteLock = new ReentrantReadWriteLock();
    sender = eventSender;
}

public void add(Object o) {
    readWriteLock.writeLock().lock();
    try {
       if (map.isEmpty()) {
          sender.send("First add");
       }
       map.put(o.hashCode(), o); // for example using hashcode for key
    }
    finally {
       readWriteLock.writeLock().unlock();
    }
}

public void remove(Object o) {
    readWriteLock.writeLock().lock();
    try {
      map.remove(o.hashCode());

      if (map.isEmpty()) {
         sender.send("remove last");
      }
    }
    finally {
      readWriteLock.writeLock().unlock();
    }  
}

public Object read(int key) {
    readWriteLock.readLock().lock();
    try {
      Object object = map.get(key);
    } 
    finally {
      readWriteLock.readLock().unlock();
    }  
    return object;
}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM