1. A computer-implemented method for modeling and verifying a concurrent system for a given memory model, said concurrent system comprising a number of 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 independent models, one for each of the threads, wherein each model is a sound abstraction of its corresponding thread; unrolling each one of the n models independently; lazily 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.