セマフォアで悩んでいます。

Proc1とProc2で排他制御やってますが、Proc2実行時にtrueにしている変数aがProc1でtrueが見えているんです。

Proc2をブレークして抜けるまではProc1の処理は待たされていることは確認できてます。

Proc2がsemaphore.release()して、Proc1のブロック解除で何故aがtrueなのか?

Semaphoreの第2パラメーターの意味が理解出来ません。trueでもfalseでも結果はおなじです。

--Proc1--
semaphore.acquire();
if (a) {
/* ここに来ちゃだめだが、何故か来る? */
}
semaphore.release();

--Proc2--
semaphore.acquire();
a=true;
/* 処理 */
a=false;
semaphore.release();

--変数定義--
public volatile Boolean a=false;

--初期化--
public semaphore = new Semaphore(1,true);