1、可见性问题,CPU缓存引起的可见性问题,使线程一对共享变量A的操作无法立即被线程二看到,导致线程二获得旧值。
2、原子问题。
例如,self._balance=self._balance-draw_amount这个语句不是原子CPU执行命令。这个语句的执行有三个CPU命令。
实例
importthreading classAccount: #定义构造函数 def__init__(self,account_no,balance): """ :paramaccount_no:账户 :parambalance:余额 """ self.account_no=account_no self._balance=balance defdraw(self,draw_amount): """ :paramdraw_amount:需要取的钱 :return: """ ifself._balance>draw_amount: print(threading.current_thread().getName()+'从'+self.account_no+"取钱成功,账户取出金额是:"+str( draw_amount)+"\n") self._balance=self._balance-draw_amount print('账户余额是',self._balance) else: print(threading.current_thread().getName()+'从'+self.account_no+"取钱失败\n") #两个线程并发取钱 account=Account('账户一',2000) threading.Thread(target=account.draw,name='线程一',args=(800,)).start() threading.Thread(target=account.draw,name='线程二',args=(800,)).start() threading.Thread(target=account.draw,name='线程三',args=(800,)).start()
以上就是python线程安全的两种情况,希望对大家有所帮助。更多Python学习指路:Python基础教程
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)