Distributed Concurrency Control

前端 未结 13 1537
栀梦
栀梦 2021-01-29 20:35

I\'ve been working on this for a few days now, and I\'ve found several solutions but none of them incredibly simple or lightweight. The problem is basically this: We have a cl

13条回答
  •  清歌不尽
    2021-01-29 21:04

    Terracotta is closer to a "tiered" model - all client applications talk to a Terracotta Server Array (and more importantly for scale they don't talk to one another). The Terracotta Server Array is capable of being clustered for both scale and availability (mirrored, for availability, and striped, for scale).

    In any case as you probably know Terracotta gives you the ability to express concurrency across the cluster the same way you do in a single JVM by using POJO synchronized/wait/notify or by using any of the java.util.concurrent primitives such as ReentrantReadWriteLock, CyclicBarrier, AtomicLong, FutureTask and so on.

    There are a lot of simple recipes demonstrating the use of these primitives in the Terracotta Cookbook.

    As an example, I will post the ReentrantReadWriteLock example (note there is no "Terracotta" version of the lock - you just use normal Java ReentrantReadWriteLock)

    import java.util.concurrent.locks.*;
    
    public class Main
    {
        public static final Main instance = new Main();
        private int counter = 0;
        private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(true);
    
        public void read()
        {
            while (true) {
                rwl.readLock().lock();
                    try {
                    System.out.println("Counter is " + counter);
                } finally {
                    rwl.readLock().unlock();
                }
                try { Thread.currentThread().sleep(1000); } catch (InterruptedException ie) {  }
            }
        }
    
        public void write()
        {
            while (true) {
                rwl.writeLock().lock();
                try {
                   counter++;
                   System.out.println("Incrementing counter.  Counter is " + counter);
                } finally {
                     rwl.writeLock().unlock();
                }
                try { Thread.currentThread().sleep(3000); } catch (InterruptedException ie) {  }
            }
        }
    
        public static void main(String[] args)
        {
            if (args.length > 0)  {
                // args --> Writer
                instance.write();
            } else {
                // no args --> Reader
                instance.read();
            }
        }
    }
    

提交回复
热议问题