from dataclasses import dataclass
from threading import Thread, Lock
from time import sleep


@dataclass
class BankAccount:
    balance: int = 1000
    lock: Lock = Lock()

    def change_balance(self, delta: int) -> None:
        with self.lock:
            new_balance = self.balance + delta
            sleep(0.001)  # force l'entrelacement entre threads
            self.balance = new_balance


account: BankAccount = BankAccount()

def deposer():
    account.change_balance(delta=200)

def retirer():
    account.change_balance(delta=-100)

t1 = Thread(target=deposer)
t2 = Thread(target=retirer)

t1.start()
t2.start()
t1.join()
t2.join()

print(f"Solde final : {account.balance}")
