一、背景
Python语言没有类似Java语言的volatile和AtomicBoolean、AtomicInteger等原子量接口。
因此:可以用排他锁来强制更新对象的属性,每次都是获取最新的结果。
二、主要代码
python
import threading
# 原子整数值
class AtomicInteger:
# 构造函数
# value是整数
def __init__(self, value: int = 0):
# 保存最新变量值
self.__value = value
# 排他锁
self.__lock = threading.Lock()
# 更新值
# nvalue是新值
def update(self, nvalue):
# 加锁
self.__lock.acquire()
# 更新值
self.__value = nvalue
# 解锁
self.__lock.release()
# 获取最新值
def get(self):
# 临时值
temp = 0
# 加锁
self.__lock.acquire()
# 获取最新值
temp = self.__value
# 解锁
self.__lock.release()
return temp
# 原子布尔值
class AtomicBoolean:
# 构造函数
# value是布尔值
def __init__(self, value: bool = False):
# 保存最新变量值
self.__value = value
# 排他锁
self.__lock = threading.Lock()
# 更新值
# nvalue是新值
def update(self, nvalue):
# 加锁
self.__lock.acquire()
# 更新值
self.__value = nvalue
# 解锁
self.__lock.release()
# 获取最新值
def get(self):
# 临时值
temp = False
# 加锁
self.__lock.acquire()
# 获取最新值
temp = self.__value
# 解锁
self.__lock.release()
return temp
三、测试代码
python
import atom
import threading
import time
# con是AtomicBoolean对象
def run(con):
# 循环执行,遇到False为退出
while con.get():
print("打印")
time.sleep(1)
print("退出循环")
if __name__ == "__main__":
# 定义原子变量
con = atom.AtomicBoolean(True)
# 创建线程
th = threading.Thread(target=run, args=(con, ))
# 启动线程
th.start()
# 阻塞输入
k = input("输入任意字符退出:")
if k:
# 设置为假
print("设置为假")
con.update(False)
如图:

四、测试结果
