一般來說,你應該把鎖只在周圍關鍵部分的界限或共享資源的使用。你應該考慮你試圖防止同時訪問和保護它。舉例來說,如果A類有一個隊列放入並讀取項目,那麼它就是對你應該保護的這個特定資源的訪問。由於OOP決定了這種資源應該由類的方法來訪問,只有A類應該保護:
class A(object):
def __init__(self, *args, **kws):
# do the initialization
self._my_queue = Queue()
self._lock = Lock()
def do_something(self):
# do initial calculations
self._lock.acquire()
item = self._my_queue.get()
self._lock.release()
# do other things
因此提出,B類應調用類A方法,這將是線程安全的。如果B類都有自己的臨界區這是相當正常的使用比單鎖更多:
class B(object):
def __init__(self, *args, **kws):
# do the initialization
self._lock = Lock()
self.a = A()
def do_something_with_a(self):
# initial calculations
self._lock.acquire()
# Critical section
result = self.a.do_something()
# do something with result
self._lock.release()
# continue the code
這樣每個類保護自己的關鍵部分,並共享資源,而且也沒有必要打破類的接口。
如果您需要保護類的C'tor,那麼您需要模塊的全局鎖,在類的範圍之外創建並初始化,或者將鎖添加到Class對象(如靜態成員C++和Java),而不是實例本身:
class B(object):
def __init__(self, *args, **kws):
if not hasattr(self.__class__, "_lock"):
self.__class__._lock = Lock()
# works with Python 2.6+ for earlier version use try-finally
with self.__class__._lock:
# Your initialization
這將保護您的C'tor