1. A method for model checking of concurrent multi-threaded programs with bounded lock chains, comprising: analyzing individual program threads in a concurrent multi-threaded program, using a model checking program stored in a memory storage device, to determine sets of reachable states and lock access patterns for bounded lock chains by: tracking sets of states reachable from a given set of states; and tracking lock acquisitions and releases by maintaining a bi-directional lock causality graph; using an acceptance condition of the lock causality graph to combine analysis results from multiple threads to determine whether there is a violation of a correctness property in the concurrent multi-threaded program; reducing a reachability problem by taking a specialized cross product that removes pairs that are not reachable; and keeping projection automata separate to circumvent a state explosion problem and avoid construction of a global automata.