importthreadingimporttime# 경쟁 상태가 발생하는 예제classBankAccount:def__init__(self):self.balance=0# 공유 자원defdeposit(self,amount):# 현재 잔액 읽기current=self.balance# 시간 지연을 통한 경쟁 상태 시뮬레이션time.sleep(0.1)# 잔액 업데이트self.balance=current+amountdefget_balance(self):returnself.balance# 경쟁 상태가 해결된 버전classSafeBankAccount:def__init__(self):self.balance=0self.lock=threading.Lock()# 상호 배제를 위한 락defdeposit(self,amount):withself.lock:# 임계 영역 보호current=self.balancetime.sleep(0.1)self.balance=current+amountdefget_balance(self):withself.lock:returnself.balance# 테스트 함수deftest_race_condition():# 경쟁 상태가 있는 계좌account=BankAccount()# 여러 스레드가 동시에 입금threads=[]for_inrange(10):t=threading.Thread(target=account.deposit,args=(100,))threads.append(t)t.start()# 모든 스레드 완료 대기fortinthreads:t.join()print(f"예상 잔액: 1000, 실제 잔액: {account.get_balance()}")# 안전한 계좌로 테스트safe_account=SafeBankAccount()# 동일한 테스트 수행threads=[]for_inrange(10):t=threading.Thread(target=safe_account.deposit,args=(100,))threads.append(t)t.start()fortinthreads:t.join()print(f"안전한 계좌 잔액: {safe_account.get_balance()}")if__name__=="__main__":test_race_condition()