Получение блокировки не мешает кому-либо получить доступ к чему-либо. Это просто контракт, который критические части кода могут проверить, разрешено ли им доступ к объекту. Это должно быть реализовано в вашем коде. Простой пример:
# Thread 1
lock.acquire() # blocks if someone else locked first
# access "protected" object here
lock.release() # give someone else the opportunity to lock
#Thread 2
lock.acquire() # blocks if someone else locked first
# access "protected" object here
lock.release() # give someone else the opportunity to lock
Итак, для вашего примера и с помощью контекстного менеджера для автоматической блокировки и снятия блокировки вы получите что-то вроде:
import threading
v = 0
lock = threading.Lock()
def increment():
global v
with lock:
v += 1
def decrement():
global v
with lock:
v -= 1
...