Java 7 выходит с новым классом конструкции параллелизма, java.util.concurrent.Phaser. Фазер - это прославленный цилиндрический барьер, который позволяет ожидать определенных фаз (или итераций) параллельного выполнения. Вы можете скачать последнюю бинарную флягу на сайте по интересам JSR 166 .
Я подумал, что у вас есть изменяемый логический флаг yHasEnetered, который по умолчанию устанавливает значение false. Таким образом, в вашем исполнении X вы можете сделать:
if(yHasEnetered)
throw new IllegalStateException();
phaser.register();
//do work here
phasre.arrive();
Фазер сам будет вести подсчет всех зарегистрированных партий, поэтому, когда Y-нить вошла, он может установить соответствующий флаг, зарегистрировать себя и дождаться продвижения.
yHasEntered=true;
int phase = phaser.register();
phaser.arriveAndAwaitAdvance(phase);
//do y work here
yHasEntered=false;
На данный момент для Y потока. Он зарегистрирует себя, получит фазу, на которой в данный момент находится фазер, приедет и будет ждать, пока все остальные выполняющиеся потоки достигнут своего соответствующего блока поступления.