cn1h
cn1h

Reputation: 1248

Java bounded non-blocking buffer for high concurrent situation

Basically I need a data structure to store the temporary chatting messages on the server side. It should be:

So my question is there any good implementation from 3rd library? For example Google Guava? Or maybe you have better idea about storing the temporary chatting messages on server?

thank you very much!

Upvotes: 11

Views: 9319

Answers (5)

Perception
Perception

Reputation: 80603

You could utilize the Apache Commons CircularFifoBuffer. It meets your first and last criteria. To support concurrency, you can wrap the base buffer in it's synchronized version like so:

Buffer fifo = BufferUtils.synchronizedBuffer(new CircularFifoBuffer());

Good luck on the project.

Upvotes: 4

Frederic Leitenberger
Frederic Leitenberger

Reputation: 2019

You can use LinkedBlockingQueue with the non-blocking methods offer (or add) and poll to access it. You can create it with a fixed capacity to make it bounded.

LinkedBlockingQueue<String> myStrings = new LinkedBlockingQueue<String>(100);
myStrings.offer("Hi!"); // returns false if limit is reached
myStrings.add("Hi, again!"); // throws exception if limit is reached
String s = myStrings.poll(); // returns null if queue is empty

Upvotes: 5

Sky
Sky

Reputation: 11

You can add non-blocking behaviour to an ArrayBlockingQueue by surrounding it with a conditional offer() statement, where failure of the queue to accept the offer results in the head being dropped and the offer being re-made:

    public class LearnToQueue {


    public static void main(String[] args){
        Queue<Integer> FIFO = new ArrayBlockingQueue<Integer>(4);

        int i = 0;

        while ( i < 10 ){

            if (!FIFO.offer(i)){
            // You can pipe the head of the queue anywhere you want to
                FIFO.remove();
                FIFO.offer(i);
            }
            System.out.println(FIFO.toString());
            i++;

        }
    }

    }

Upvotes: 1

Ben Manes
Ben Manes

Reputation: 9591

LinkedTransferQueue is a blocking, unbounded queue that doesn't enforce strict FIFO ordering. It will only block when taking from an empty queue, but never on adding to one. You could add a soft cap to evict elements by adding either a size or read & write counters.

Depending on your requirements, you may be able to write a custom lock-free ring buffer.

Upvotes: 0

UmNyobe
UmNyobe

Reputation: 22890

Did you take a look at ConcurrentLinkedQueue? The page says

This implementation employs an efficient "wait-free" algorithm...

Wait-freedom is one of the strongest guarantee you can obtain....

Upvotes: 4

Related Questions