import threading counterA = 0 counterB = 0 mutexA = threading.Lock() mutexB = threading.Lock() class MyThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): self.fun1() self.fun2() def fun1(self): global mutexA, mutexB if mutexA.acquire(): print "I am %s , get res: %s" %(self.name, "ResA") if mutexB.acquire(): print "I am %s , get res: %s" %(self.name, "ResB") mutexB.release() mutexA.release() def fun2(self): global mutexA, mutexB if mutexB.acquire(): print "I am %s , get res: %s" %(self.name, "ResB") if mutexA.acquire(): print "I am %s , get res: %s" %(self.name, "ResA") mutexA.release() mutexB.release() if __name__ == "__main__": for i in range(0, 100): my_thread = MyThread() my_thread.start()