python的重入锁(简单说明)

python 重入锁

重入锁就是可以多次获取的锁.(条件是在同一线程下) 对应的是threading.RLock。普通的锁是threading.Lock,这个锁在同一线程下 未释放的情况下再次获取会造成死锁,所以就需要RLock
如下:
普通情况下 会死锁

import threading
lock = threading.Lock()

with lock:
    print "first get lock!"
    with lock:
        print "second get lock !"

# 这种情况下只会输出 'first get lock!', 
# 并且程序在不强制中断的情况下始终阻塞在 第二次获取锁的位置

怎么办?

改成下面这种情况就可以了!

import threading
lock = threading.RLock()
# ...

### 如何创建和使用重入锁(Reentrant Lock) 重入锁(Reentrant Lock)是一种允许同一个线程多次获取同一把的同步机制。它在多线程环境中用于保护共享资源,确保线程安全的同时提供更高的灵活性。以下是 Python 和 Java 中创建和使用重入锁的示例及说明。 #### Python 中的重入锁RLockPython 的 `threading` 模块提供了 `RLock` 类,用于实现重入锁。以下是一个简单的代码示例,展示如何使用 `RLock` 来保护共享资源: ```python import threading # 创建一个 RLock 实例 lock = threading.RLock() shared_resource = 0 def increment(): global shared_resource # 获取 lock.acquire() try: # 修改共享资源 shared_resource += 1 print(f"Resource incremented: {shared_resource}") # 同一线程可以再次获取 lock.acquire() try: shared_resource += 1 print(f"Resource incremented again: {shared_resource}") finally: # 释放内层 lock.release() finally: # 释放外层 lock.release() # 创建线程 thread1 = threading.Thread(target=increment) thread2 = threading.Thread(target=increment) # 启动线程 thread1.start() thread2.start() # 等待线程完成 thread1.join() thread2.join() print(f"Final shared resource value: {shared_resource}") ``` 上述代码中,`RLock` 允许同一线程多次获取而不会导致死锁[^5]。每次调用 `acquire()` 必须对应一次 `release()`,以确保最终被正确释放。 #### Java 中的重入锁(ReentrantLock) Java 的 `java.util.concurrent.locks` 包提供了 `ReentrantLock` 类,用于实现重入锁。以下是一个简单的代码示例,展示如何使用 `ReentrantLock` 来保护共享资源: ```java import java.util.concurrent.locks.ReentrantLock; public class ReentrantLockExample { private static final ReentrantLock lock = new ReentrantLock(); private static int counter = 0; public static void main(String[] args) { Runnable task = () -> { lock.lock(); // 获取 try { for (int i = 0; i < 1000; i++) { counter++; } // 同一线程可以再次获取 lock.lock(); try { counter++; } finally { lock.unlock(); // 释放内层 } } finally { lock.unlock(); // 释放外层 } }; Thread thread1 = new Thread(task); Thread thread2 = new Thread(task); thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Counter: " + counter); // 输出: Counter: 2001 } } ``` 上述代码中,`ReentrantLock` 允许同一线程多次获取,且每次获取必须对应一次释放的操作[^2]。 ### 重入锁的关键特性 1. **可重入性**:同一线程可以多次获取同一把而不导致死锁[^3]。 2. **计数**:每次调用 `acquire()` 或 `lock()` 都会增加锁的计数,每次调用 `release()` 或 `unlock()` 则减少计数。只有当计数为零时,才会被完全释放[^4]。 3. **灵活性**:相比内置(如 Python 的 `Lock` 或 Java 的 `synchronized`),重入锁提供了更灵活的定机制,例如支持尝试获取(`tryLock()`)、设置超时等。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值