Terracotta ближе к «многоуровневой» модели - все клиентские приложения взаимодействуют с массивом серверов Terracotta (и, что более важно, для масштабирования они не общаются друг с другом). Серверный массив Terracotta способен кластеризоваться как для масштабирования, так и для доступности (зеркальный, для доступности и полосатый, для масштаба).
В любом случае, как вы, вероятно, знаете, Terracotta дает вам возможность выражать параллелизм во всем кластере так же, как вы делаете это в одной JVM, используя синхронизированный POJO / wait / notify или любой из примитивов java.util.concurrent. такие как ReentrantReadWriteLock, CyclicBarrier, AtomicLong, FutureTask и т. д.
Существует множество простых рецептов, демонстрирующих использование этих примитивов в Терракотовая кулинарная книга .
В качестве примера я опубликую пример ReentrantReadWriteLock (обратите внимание, что нет версии Terracotta для блокировки - вы просто используете обычный 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();
}
}
}