1. A computer-implemented method for modeling and verifying a concurrent system for a given memory model, said concurrent system comprising two or more interacting threads wherein each one of the threads communicate with one another using shared variables and synchronization primitives, said method comprising the steps of: generating n>1 independent models, one for each of the threads, wherein each model is a sound abstraction of its corresponding thread wherein the sound abstraction includes true behaviours and spurious behaviours; unrolling each one of the n models independently; adding as needed one or more constraints between one or more pairs of inter-model control states to model inter-thread communication; and generating a set of violations through bounded analysis.