fraternityjava 2020-03-01
(保证数据安全, 自己加锁容易出现死锁.)
为了保证数据安全而出现的一把锁,当多个进程抢占一个资源时 将并发变成了串行 谁先抢到锁先执行 如果这个程序遇到了io阻塞 操作系统会使cpu切换到其他进程,当切换到其他进程时发现他没有这吧锁,就会跳过他从而保证了数据安全 注意锁必须要同一把 多用于 抢购 依次执行
# 互斥锁与join区别共同点? (面试题) # 共同点: 都是完成了进程之间的串行. # 区别: join认为控制的进程串行,互斥锁是随机的抢占资源.保证了公平性
# 在生活中我们会遇到一些事情,必须在保证公平的情况下又可以保护数据安全 # 并发变为串行 # 以下是打印机实列 我们希望谁先抢到,谁先运行 且是依次执行 from multiprocessing import Process from multiprocessing import Lock import os import time import random def task(lock):#模拟打印 lock.acquire()#加锁 print(f'{os.getpid()}打印开始了') time.sleep(random.randint(1,3)) print(f'{os.getpid()}打印结束了') lock.release()#解锁 if __name__ == '__main__': lock=Lock() for i in range(4): p=Process(target=task,args=((lock,))) p.start() # 遇到的问题 # 为什么加锁要同一把锁 不是同一把会怎么样? # 锁就是一个凭证,当只有一把锁时 他保证了运行时的唯一行,如果大家都有了也就不可以约束了