我发现这个问题的答案很少,但所有的答案都是基于java的。它们是java特有的。这可能看起来像重复,但我找不到任何python的答案。
我有一个单例类:
class A():
_lock = threading.Lock()
def __new__(cls):
obj = cls.__dict__.get("__it__")
if obj is not None:
return obj
with cls._lock:
if obj is None:
cls.__it__ = obj = object.__new__(cls)
obj.init()
return obj
def init(self):
self.value = 2
def call_me(self, input):
self.value = input
temp = self.value
print(temp)
# two threads call the function at exactly same time.
# thread 1 calls
A().call_me(5)
# thread 2 calls
A().call_me(7)
现在,如果两个线程创建A的对象,那么我确信它的线程是安全的,因为它是双锁检查模式。但是类属性self.value
和方法变量temp
线程安全吗?
因为如果两个线程都是A的相同实例,那么两个线程都可以改变值,然后这是一个问题?
不,call_me方法不是线程安全的。该锁用于确保只创建该类的一个实例,也就是说,它是单例模式。