In fact, there are many opportunities, some of which are highly unlikely, but they are still possible, and after 1 million executions this is what I found.
the code:
public class Stone implements Runnable { static int id = 1; static StringBuffer buffer = new StringBuffer(); public void run() { try { id = 1 - id; if (id == 0) { pick(); } else { release(); } } catch (Exception e) { } } private static synchronized void pick() throws Exception { buffer.append("P "); buffer.append("Q "); } private synchronized void release() throws Exception { buffer.append("R "); buffer.append("S "); } public static void main(String[] args) { int count = 1000000; Map<String, Integer> results = new HashMap<String, Integer>(); System.out.println("Running " + count + " times..."); for (int i = 0; i< count; i++) { buffer = new StringBuffer(); Stone stone = new Stone(); Thread t1 = new Thread(stone); Thread t2 = new Thread(stone); t1.start(); t2.start(); while (t1.isAlive() || t2.isAlive()) {
Results:
Running 1000000 times... 50000... [RSPQ , PQRS , PRSQ , RPQS ] 100000... [RSPQ , PQRS , PRSQ , RPQS ] 150000... [RSPQ , PQRS , PRSQ , RPQS ] 200000... [RSPQ , PQRS , PRSQ , RPQS ] 250000... [RSPQ , PQRS , PRSQ , RPQS ] 300000... [RSPQ , PQRS , PRSQ , RPQS ] 350000... [RSPQ , PQRS , PRSQ , PRQS , RPQS ] 400000... [RSPQ , PQRS , PRSQ , PRQS , RPQS ] 450000... [RSPQ , PQRS , PRSQ , PRQS , RPQS ] 500000... [RSPQ , PQRS , PRSQ , PRQS , RPQS ] 550000... [RSPQ , PQRS , PRSQ , PRQS , RPQS ] 600000... [RSPQ , PQRS , PRSQ , PRQS , RPQS ] 650000... [RSPQ , PQRS , PRSQ , PRQS , RPQS ] 700000... [RSPQ , PQRS , PRSQ , PRQS , RPQS ] 750000... [RSPQ , PQRS , PRSQ , PRQS , RPQS ] 800000... [RSPQ , PQRS , PRSQ , PRQS , RPQS ] 850000... [RSPQ , PQRS , PRSQ , PRQS , RPQS ] 900000... [RSPQ , PQRS , PRSQ , PRQS , RPQS ] 950000... [PQPQ , RSPQ , PQRS , PRSQ , PRQS , RPQS ] done, results were: PQPQ : 1 RSPQ : 60499 PQRS : 939460 PRSQ : 23 PRQS : 2 RPQS : 15
I think we have proven that PQPQ indeed possible, albeit with an extremely low probability of about one million ...
[edit: another run, other results showing RSRS :]
done, results were: RSRS : 1 RPSQ : 2 PQPQ : 1 RSPQ : 445102 PQRS : 554877 PRSQ : 5 PRQS : 2 RPQS : 10