【10.4】线程同步--Lock、RLock

 1 #!/user/bin/env python
 2 # -*- coding:utf-8 -*-
 3
 4 import dis
 5 import threading
 6 from threading import Lock
 7 total = 0
 8 lock = Lock()
 9
10
11 def add():
12     global total
13     global lock
14     for i in range(1000000):
15         # 获取锁
16         lock.acquire()
17         total += 1
18         # 释放锁
19         lock.release()
20
21
22 def desc():
23     global total
24     global lock
25     for i in range(1000000):
26         # 获取锁
27         lock.acquire()
28         total -= 1
29         # 释放锁
30         lock.release()
31
32
33 thread1 = threading.Thread(target=add)
34 thread2 = threading.Thread(target=desc)
35
36 thread1.start()
37 thread2.start()
38
39
40 def add1(a):
41     a += 1
42
43
44 def desc1(a):
45     a -= 1
46
47
48 """
49 1.load a
50 2.load 1
51 3.+(-)
52 4.赋值给a
53 """
54 print(dis.dis(add1))
55 print(dis.dis(desc1))
56
57 thread1.join()
58 thread2.join()
59
60 print(total)
 41           0 LOAD_FAST                0 (a)
              2 LOAD_CONST               1 (1)
              4 INPLACE_ADD
              6 STORE_FAST               0 (a)
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE
None
 45           0 LOAD_FAST                0 (a)
              2 LOAD_CONST               1 (1)
              4 INPLACE_SUBTRACT
              6 STORE_FAST               0 (a)
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE
None

C:\Users\Administrator\Python\imooc>python demo.py
 41           0 LOAD_FAST                0 (a)
              2 LOAD_CONST               1 (1)
              4 INPLACE_ADD
              6 STORE_FAST               0 (a)
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE
None
 45           0 LOAD_FAST                0 (a)
              2 LOAD_CONST               1 (1)
              4 INPLACE_SUBTRACT
              6 STORE_FAST               0 (a)
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE
None
0

C:\Users\Administrator\Python\imooc>python demo.py
 41           0 LOAD_FAST                0 (a)
              2 LOAD_CONST               1 (1)
              4 INPLACE_ADD
              6 STORE_FAST               0 (a)
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE
None
 45           0 LOAD_FAST                0 (a)
              2 LOAD_CONST               1 (1)
              4 INPLACE_SUBTRACT
              6 STORE_FAST               0 (a)
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE
None
0

1.用锁会影响性能

2.锁会引起死锁

RLock

 1 #!/user/bin/env python
 2 # -*- coding:utf-8 -*-
 3
 4 import threading
 5 # RLock,在同一个线程里面,可以连续调用多次acquire,一定要注意acquire的次数要和release的次数相等
 6 # 线程间还是有相互竞争的关系
 7 from threading import RLock
 8 total = 0
 9 lock = RLock()
10
11
12 def add():
13     global total
14     global lock
15     for i in range(1000000):
16         # 获取锁
17         lock.acquire()
18         lock.acquire()
19         total += 1
20         # 释放锁
21         lock.release()
22         lock.release()
23
24
25 def desc():
26     global total
27     global lock
28     for i in range(1000000):
29         # 获取锁
30         lock.acquire()
31         total -= 1
32         # 释放锁
33         lock.release()
34
35
36 thread1 = threading.Thread(target=add)
37 thread2 = threading.Thread(target=desc)
38
39 thread1.start()
40 thread2.start()
41
42 thread1.join()
43 thread2.join()
44
45 print(total)
0

原文地址:https://www.cnblogs.com/zydeboke/p/11298248.html

时间: 2024-10-12 20:26:06

【10.4】线程同步--Lock、RLock的相关文章

线程同步 – lock和Monitor

在多线程代码中,多个线程可能会访问一些公共的资源(变量.方法逻辑等等),这些公共资源称为临界区(共享区):临界区的资源是不安全,所以需要通过线程同步对多个访问临界区的线程进行控制. 同样,有些时候我们需要多个线程按照特定的顺序执行,这时候,我们也需要进行线程同步. 下面,我们就看看C#中通过lock和Monitor进行线程同步. lock关键字 lock是一种非常简单而且经常使用的线程同步方式,lock 关键字将语句块标记为临界区. lock 确保当一个线程位于代码的临界区时,另一个线程不能进入

【转】多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)

本篇从Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler的类关系图开始,希望通过 本篇的介绍能对常见的线程同步方法有一个整体的认识,而对每种方式的使用细节,适用场合不会过多解释.让我们来看看这几个类的关系图: 1.lock关键字      lock是C#关键词,它将语句块标记为临界区,确保当一个线程位于代码的临界区时,另一个线程不进入临界区.如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放.方法是获取给定

C#多线程:深入了解线程同步lock,Monitor,Mutex,同步事件和等待句柄(中)

本篇继续介绍WaitHandler类及其子类 Mutex,ManualResetEvent,AutoResetEvent的用法..NET中线程同步的方式多的让人看了眼花缭乱,究竟该怎么去理解呢?其实,我们抛开.NET环境看线程同步,无非是执行两种操作:一是互斥/加锁,目的是保证临界区代码操作的"原子性":另一种是信号灯操作,目的是保证多个线程按照一定顺序执行,如生产者线程要先于消费者线程执行..NET中线程同步的类无非是对这两种方式的封装,目的归根结底都可以归结为实现互斥/ 加锁或者是

C#多线程开发10:线程同步之Semaphore类

Semaphore类表示信号量. 信号量和互斥类似,只是信号量可以同时由多个线程使用,而互斥只能由一个线程使用.也就是说,使用信号量时,可以多个线程同时访问受保护的资源.下面实例演示了"学生到食堂就餐"的场景,一共有10个学生需要就餐,但是食堂每次只能接纳4名学生就餐,所以将信号量的计数设置为4,每次有4个任务(就餐任务)可以获得锁定.剩下的学生就必须等待,等到锁定被解除时,学生才可以继续获得锁定,进入食堂就餐. using System; using System.Threading

谈谈线程同步Lock和unLock

Lock可以使用Condition进行线程之间的调度,它有更好的灵活性,而且在一个对象里面可以有多个Condition(即对象监视器),则线程可以注册在不同的Condition,从而可以 有选择性的调度线程,更加灵活. Synchronized则使用Object对象本身的notify, wait, notityAll调度机制,相当于整个对象只有一个单一的Condition(即该对象本身)所有的线程都注册在它身上,线程调度的 时候之后调度所有得注册线程,没有选择权,会出现相当大的问题 . 基于AQ

一道线程同步面试题

package com.wsy.model; /** * 完成主线程循环10次,接着子线程循环5次,如此往复10次 * * @author wsy * */ public class TraditionalThreadCommunication { static Bussiness bussiness = new Bussiness(); public static void main(String[] args) { new Thread(new Runnable() { @Override

13 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件  queue队列 生产者消费者模型 Queue队列 开发一个线程池

本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 操作系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把

线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯

1.Lock相关知识介绍 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是哪块先熟了,先收割哪块. 下面举一个面试题的例子来引出Lock缓存读写锁的案例,一个load()和get()方法返回值为空时的情况:load()的返回值是一个代理对象,而get()却是一个实实在在的对象:所以当返回对象为空是,get()返回null,load()返回一个异常对象:具体分析如下: 一个读写锁的缓存库案例:用上面那道面试题分析则很好理解: 线程阻塞问题:运用多个Condition对象解决 2. Lock

JAVA 并发编程-线程同步通信技术(Lock和Condition)(十)

在之前的博客中已经介绍过线程同步通信技术<JAVA 并发编程-传统线程同步通信技术(四)>,上篇是使用的synchronized,wait,notify来实现,今天我们使用的是Lock和Condition,下面我们结合两者对比来学习. 简单的Lock锁应用: /** * 简单Lock的应用 * @author hejingyuan * */ public class LockTest { public static void main(String[] args) { new LockTest