zoukankan      html  css  js  c++  java
  • Python--day41--线程锁

    1,死锁

    死锁代码示例:

     1 import time
     2 from threading import Lock, Thread
     3 
     4 noodle_lock = Lock()
     5 fork_lock = Lock()
     6 
     7 def eat1(name):
     8     noodle_lock.acquire()
     9     print('%s拿到面了'%name)
    10     fork_lock.acquire()
    11     print('%s拿到叉子了'%name)
    12     print('%s吃面'%name)
    13     fork_lock.release()
    14     noodle_lock.release()
    15 
    16 def eat2(name):
    17     fork_lock.acquire()
    18     print('%s拿到叉子了' % name)
    19     time.sleep(1)
    20     noodle_lock.acquire()
    21     print('%s拿到面了'%name)
    22     print('%s吃面'%name)
    23     noodle_lock.release()
    24     fork_lock.release()
    25 
    26 Thread(target=eat1,args=('alex',)).start()
    27 Thread(target=eat2,args=('Egon',)).start()
    28 Thread(target=eat1,args=('bossjin',)).start()
    29 Thread(target=eat1,args=('nezha',)).start()

    运行结果:

    2,线程锁只能保证同一时间只有一个线程取n值,并不能保证数据安全

    3,加锁保证了n不会被多个线程操纵;加锁保证数据安全

     1 import time
     2 from threading import Lock,Thread
     3 
     4 def func(lock):
     5     global n
     6     #加锁保证了n不会被多个线程操纵
     7     #获取锁的钥匙,加锁
     8     lock.acquire()
     9     temp = n
    10     time.sleep(0.2)#睡眠0.2s
    11     n = temp -1
    12     #释放锁
    13     lock.release()
    14 
    15 n = 10
    16 t_lst = []
    17 lock = Lock()
    18 for i in range(10):
    19     t = Thread(target=func,args=(lock,))
    20     t.start()
    21     t_lst.append(t)
    22 
    23 
    24 for t in t_lst:t.join()
    25 print(n)

    运行结果:

  • 相关阅读:
    接口请求的例子
    SQLServer跨库查询分布式查询
    查看数据库估计的执行计划
    数据库对比工具
    十步完成windows服务的安装
    cdn 浏览器缓存机制
    quartz spring 整合例子
    利用jquery 实现多文件上传
    监测数据库的结构变化
    yii sql的输出
  • 原文地址:https://www.cnblogs.com/xudj/p/10345699.html
Copyright © 2011-2022 走看看