Java 安全地将ByteBuffer发布到工作线程

Java 安全地将ByteBuffer发布到工作线程,java,multithreading,nio,Java,Multithreading,Nio,我正在使用java.nio选择器编写一个网络服务器。它的设计目的是从网络获取数据并将其推送到工作线程,工作线程执行一些数据处理 我不知道如何将读取字节传递给工作人员并从他们那里获得响应 目前,我正在考虑使用ByteBuffers的并发队列将读取的数据传递给工人 while(keyIterator.hasNext()) { SelectionKey key = keyIterator.next(); keyIterator.remove(); if(!key.isVali

我正在使用java.nio选择器编写一个网络服务器。它的设计目的是从网络获取数据并将其推送到工作线程,工作线程执行一些数据处理

我不知道如何将读取字节传递给工作人员并从他们那里获得响应

目前,我正在考虑使用ByteBuffers的并发队列将读取的数据传递给工人

while(keyIterator.hasNext()) {
    SelectionKey key = keyIterator.next();
    keyIterator.remove();

    if(!key.isValid())
        continue;
    if(key.isAcceptable()) {
        accept...
        ConcurrentLinkedQueue<ByteBuffer> queue = new ConcurrentLinkedQueue<>();
        key.attach(queue);
        pushToWorker(queue);
    }
    if(key.isReadable()) {
        ByteBuffer buffer = ByteBuffer.allocate(4096);
        SocketChannel clientsc = (SocketChannel) key.channel();
        clientsc.read(buffer);
        ConcurrentLinkedQueue queue = (ConcurrentLinkedQueue) key.attachment();
        queue.offer(buffer); //publication
        ...
    }
    ...  
}
while(keyIterator.hasNext()){
SelectionKey=keyIterator.next();
keyterator.remove();
如果(!key.isValid())
继续;
if(key.isAcceptable()){
接受
ConcurrentLinkedQueue=新建ConcurrentLinkedQueue();
键。附加(队列);
推送工(队列);
}
if(key.isReadable()){
ByteBuffer缓冲区=ByteBuffer.allocate(4096);
SocketChannel clientsc=(SocketChannel)key.channel();
clientsc.read(缓冲区);
ConcurrentLinkedQueue=(ConcurrentLinkedQueue)键。附件();
queue.offer(缓冲区);//发布
...
}
...  
}

以这种方式发布ByteBuffer似乎不安全(请参见发布行)。什么是正确的方法?有什么简单的方法可以与员工沟通吗?

这样做是安全的

提供所有必要的保证:

内存一致性影响:与其他并发集合一样,在将对象放入ConcurrentLinkedQueue之前,线程中的操作发生在另一个线程中从ConcurrentLinkedQueue访问或删除该元素之后的操作之前