В этом вопросе из элементов собеседований по программированию утверждается, что в следующем коде существует тупик в сценарии, в котором «U1 инициирует передачу в U2, а сразу после этого U2 инициирует передачу в U1. Поскольку каждая передача происходит в отдельном потоке, первый поток может заблокировать U1, а второй - U2 "
class Account:
_global_id = 0
def __init__(self, balance):
self._balance = balance
self._id = Account._global_id
Account._global_id += 1
self._lock = threading.RLock()
def get_balance(self):
return self._balance
@staticmethod
def transfer(acc_from, acc_to, amount):
th = threading.Thread(target=acc_from._move, args=(acc_to, amount))
th.start()
def _move(self, acc_to, amount):
with self._lock:
if amount > self._balance:
return False
acc_to._balance += amount
self._balance -= amount
print('returning True')
return True
Я не вижу, как в этом случае возникает тупик. U1 и U2 имеют отдельные блокировки, и, насколько я могу судить, thread1 просто блокирует U1, а thread2 блокирует U2, поскольку метод _move просто использует self._lock и не затрагивает acc_to._lock. Чего мне не хватает?