view asyncio_threads/bank_question/main.py @ 71:75de5903355c

Giagantic changes that update Dowa library to be more align with stb style array and hashmap. Updated Seobeo to be caching on server side instead of file level caching. Deleted bunch of things I don't really use.
author June Park <parkjune1995@gmail.com>
date Sun, 28 Dec 2025 20:34:22 -0800
parents 46daba6e3cf4
children
line wrap: on
line source

# # Bank Account
# 
# You are given a simplified multi-threaded “bank account” implementation used by one of our infrastructure teams. The current code processes deposits concurrently but produces incorrect results.
# 
# Task
# 
# Identify the concurrency bugs in the implementation.
# 
# Explain why these bugs occur.
# 
# Fix the implementation without modifying the existing BankAccount class directly.
# 
# You may use subclassing (Python) or embedding (Go-style composition), depending on the language you choose.
# 
# Ensure your solution is thread-safe and produces the correct final balance (1200).

from threading import Lock
from concurrent.futures import ThreadPoolExecutor
import time

class BankAccount:
    def __init__(self, balance):
        self.balance = balance
        self._lock = Lock()

    def deposit(self, amount):
        while (self._lock.locked()):
            pass
        self._lock.acquire()
        new_balance = self.balance + amount  # read
        time.sleep(0.1)                      # simulate delay
        self.balance = new_balance           # write
        self._lock.release()


account = BankAccount(0)

with ThreadPoolExecutor(max_workers=2) as executor:
    futures = [
        executor.submit(account.deposit, 500),
        executor.submit(account.deposit, 700),
    ]
print(account.balance)