Дальше, из соображений про цепочки release-acquire:
Thread 1: a[0] = 1; future1.set(true);
Thread 2: a[1] = 1; future2.set(true);
Thread 3: future1.get(); future2.get(); print(a[0] + a[1]); // гарантированно печатает "2"
Так, в принципе, с передачей данных туда-сюда работают практически все пулы потоков.