python threading lock和rlock_python threading编程中的LOCK和RLOCK(可重入锁)

找到一本PYTHON并发编辑的书,

弄弄。。

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import threading

import time

shared_resource_with_lock = 0

shared_resource_with_no_lock = 0

COUNT = 100000

shared_resource_lock = threading.Lock()

class Box(object):

lock = threading.RLock()

def __init__(self):

self.total_items = 0

def execute(self, n):

Box.lock.acquire()

self.total_items += n

Box.lock.release()

def add(self):

Box.lock.acquire()

self.execute(1)

Box.lock.release()

def remove(self):

Box.lock.acquire()

self.execute(-1)

Box.lock.release()

def adder(box, items):

while items > 0:

print("adding 1 item in the box\n")

box.add()

time.sleep(5)

items -= 1

def remover(box, items):

while items > 0:

print("removing 1 item in the box")

box.remove()

time.sleep(5)

items -= 1

def increment_with_lock():

global shared_resource_with_lock

for i in range(COUNT):

shared_resource_lock.acquire()

shared_resource_with_lock += 1

shared_resource_lock.release()

def decrement_with_lock():

global shared_resource_with_lock

for i in range(COUNT):

shared_resource_lock.acquire()

shared_resource_with_lock -= 1

shared_resource_lock.release()

def increment_without_lock():

global shared_resource_with_no_lock

for i in range(COUNT):

shared_resource_with_no_lock += 1

def decrement_without_lock():

global shared_resource_with_no_lock

for i in range(COUNT):

shared_resource_with_no_lock -= 1

if __name__ == "__main__":

t1 = threading.Thread(target = increment_with_lock)

t2 = threading.Thread(target = decrement_with_lock)

t3 = threading.Thread(target = increment_without_lock)

t4 = threading.Thread(target = decrement_without_lock)

t1.start()

t2.start()

t3.start()

t4.start()

t1.join()

t2.join()

t3.join()

t4.join()

print ("the value of shared variable with lock management is %s"\

%shared_resource_with_lock)

print ("the value of shared variable with race condition is %s"\

%shared_resource_with_no_lock)

items = 5

print("putting %s items in the box " % items)

box = Box()

t1 = threading.Thread(target=adder, args=(box, items))

t2 = threading.Thread(target=remover, args=(box, items))

t1.start()

t2.start()

t1.join()

t2.join()

print ("%s items still remain in the box " % box.total_items)

[Python 多线程] RLock可重入锁 (九)

RLock 可重复锁,是线程相关的锁.同样是线程相关的还有threading.local. 线程A获得可重用锁,并可以多次成功获取,不会阻塞.最后要再线程A中和acquire次数相同的release. ...

Java并发编程:用AQS写一把可重入锁

Java并发编程:自己动手写一把可重入锁详述了如何用synchronized同步的方式来实现一把可重入锁,今天我们来效仿ReentrantLock类用AQS来改写一下这把锁.要想使用AQS为我们服务, ...

Java并发编程:自己动手写一把可重入锁

关于线程安全的例子,我前面的文章Java并发编程:线程安全和ThreadLocal里面提到了,简而言之就是多个线程在同时访问或修改公共资源的时候,由于不同线程抢占公共资源而导致的结果不确定性,就是在并 ...

synchronized关键字,Lock接口以及可重入锁ReentrantLock

多线程环境下,必须考虑线程同步的问题,这是因为多个线程同时访问变量或者资源时会有线程争用,比如A线程读取了一个变量,B线程也读取了这个变量,然后他们同时对这个变量做了修改,写回到内存中,由于是同时做修 ...

浅谈Java中的锁:Synchronized、重入锁、读写锁

Java开发必须要掌握的知识点就包括如何使用锁在多线程的环境下控制对资源的访问限制 ◆ Synchronized ◆ 首先我们来看一段简单的代码: 12345678910111213141516171 ...

Python连载36-线程数量限制、Timer、可重入锁

一.允许一个资源最多由几个线程同时进行 命令行:threading.Semaphore(个数) 代表现在最多有几个线程可以进行操作 import threading import time #参数定义 ...

关于python多线程编程中join()和setDaemon()的一点儿探究

关于python多线程编程中join()和setDaemon()的用法,这两天我看网上的资料看得头晕脑涨也没看懂,干脆就做一个实验来看看吧. 首先是编写实验的基础代码,创建一个名为MyThread的  ...

举例讲解Python中的死锁、可重入锁和互斥锁

举例讲解Python中的死锁.可重入锁和互斥锁 一.死锁 简单来说,死锁是一个资源被多次调用,而多次调用方都未能释放该资源就会造成死锁,这里结合例子说明下两种常见的死锁情况. 1.迭代死锁 该情况是一 ...

Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)

Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在学习Java的之前,你可能已经听说过读 ...

随机推荐

Mac读取Andriod屏幕截图

int main(int argc, const char * argv[]) { // insert code here... string str3 = "/Users/Ethan/Do ...

HDU 3966 Aragorn's Story 树链剖分+树状数组 或 树链剖分+线段树

HDU 3966 Aragorn's Story 先把树剖成链,然后用树状数组维护: 讲真,研究了好久,还是没明白 树状数组这样实现"区间更新+单点查询"的原理... 神奇... ...

[转]qt中文乱码问题

http://blog.csdn.net/brave_heart_lxl/article/details/7186631#

iOSpush过后返回多级界面

有导航控制器push过后pop可以反回上一个界面,然而我们需要返回多级界面有下面两种方法 调用API - (NSArray *)popToViewController:(UIViewControlle ...

liux环境下配置jdk

大家都知道,现在JAVA的发展可谓是如日中天,它覆盖面非常广泛,小到个人PC,大到商业应用都能见到它的身影.以前它是由SUN公司来维护的,现在已经归属到甲骨文旗下了. 今天我们来学习一下Java JD ...

精通CSS高级Web标准解决方案(1-1选择器)

设计代码的结构 使用有意义的标记 css可以控制页面的外观并将表现与内容分隔开. 在分配ID与类名时尽量保证有意义且与表现无关. div可以对块级元素进行分组,而span可以对行内元素进行分组或标识. ...

jq动态添加的元素触发绑定事件无效

不可思议的纯CSS导航栏下划线跟随效果

先上张图,如何使用纯 CSS 制作如下效果? 在继续阅读下文之前,你可以先缓一缓.尝试思考一下上面的效果或者动手尝试一下,不借助 JS ,能否巧妙的实现上述效果. OK,继续.这个效果是我在业务开发的 ...

Leetcode_257_Binary Tree Paths

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/49432057 Given a binary tree, r ...

11. IDS (Intrusion detection systems 入侵检测系统 6个)

Snort该网络入侵检测和防御系统擅长于IP网络上的流量分析和数据包记录. 通过协议分析,内容研究和各种预处理器,Snort可以检测到数千个蠕虫,漏洞利用尝试,端口扫描和其他可疑行为. Snort使用 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值