1. A method of coordinating access to common memory by multiple program threads comprising the steps of: in each given program thread, (a) detecting the beginning of a critical section of the given program thread in which conflicts to access of the common memory could occur resulting from execution of other program threads; (b) speculatively executing the critical section; and (c) committing the speculative execution of the critical section if there has been no conflict and squashing the speculative execution of the critical section if there has been a conflict.