Day20 数据安全

一.线程间数据共享

数据的存储跟线程无关; 一个进程中的数据在多个线程中可以直接用
情况1: 在子线程中使用主线程中的数据

list1 = [10, 20, 30]


def func1():
    list1.append(100)


def func2():
    list1[0] = 'hello'


t1 = Thread(target=func1)
t2 = Thread(target=func2)
t1.start()
t2.start()

t1.join()
t2.join()
print(list1)

情况2: 在子线程中使用子线程中的数据

list1 = [10, 20, 30]


def func1():
    global list1
    list1 = [1, 2, 3]


def func2():
    t = Thread(target=func1)
    t.start()
    print(list1)


t1 = Thread(target=func2)
t1.start()

二.数据共享安全问题以及锁的使用

获取锁对象
获取数据
操作完成后
释放锁对象

注意: 使用锁的时候保证一个数据对应一把锁

from time import sleep
from threading import Thread, Lock


class Account:
    """银行账号"""
    _card_num = 0

    def __init__(self, name, tel, balance, bank='建设银行'):
        self.bank = bank
        self._card_num += 1
        self.name = name
        self.tel = tel
        self.balance = balance
        self.lock = Lock()      # 1.创建锁

    def save_money(self, amount):
        # 获取余额
        print('=========开始存钱!============')
        # 2.使用锁
        self.lock.acquire()
        # 存钱
        bl = self.balance
        print('余额:%s' % bl)
        sleep(4)
        self.balance += amount
        # 3.释放锁
        self.lock.release()
        print('存钱:{}, 余额:{}'.format(amount, self.balance))
        print('========存钱结束!==========')

    def draw_money(self, amount):
        print('=======开始取钱!=========')
        self.lock.acquire()
        bl = self.balance
        print('余额:%s' % bl)
        sleep(10)
        if bl < amount:
            print('余额不足!!!')
            print('======取钱结束======')
            return
        self.balance -= amount
        self.lock.release()
        print('取钱:{}, 余额:{}'.format(amount, self.balance))
        print('========取钱结束========')


account = Account('xh', '12345', 10)

t1 = Thread(target=account.save_money, args=(5,))
t2 = Thread(target=account.draw_money, args=(5,))
t1.start()
t2.start()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,148评论 1 32
  • 引用自多线程编程指南应用程序里面多个线程的存在引发了多个执行线程安全访问资源的潜在问题。两个线程同时修改同一资源有...
    Mitchell阅读 2,026评论 1 7
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 2,998评论 1 18
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,510评论 1 15
  • 林炳文Evankaka原创作品。转载自http://blog.csdn.net/evankaka 本文主要讲了ja...
    ccq_inori阅读 671评论 0 4