获取lock锁后发生异常后,线程退出,lock锁不释放
package com.horizon.thread.basic;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 演示功能:
* 当lock锁获得后如果发生异常,线程结束,但是 lock锁不会释放
* @author <a href="wangxinchun@yahoo.com.cn">新春.王</a>
*
*/
public class ThreadException extends Thread{
static Lock lock1 = new ReentrantLock();
static Lock lock2 = new ReentrantLock();
private static boolean flag = true;
public ThreadException() {
}
public static void main(String[] args) {
new ThreadException().start();
new ThreadException().start();
}
@Override
public void run() {
if(flag){
flag = false;
lock1.lock();
if(true){ //此处故意抛出运行时异常,当前线程结束,但是锁没有释放
throw new NumberFormatException();
}
lock2.lock();
System.out.println("flag :true");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
lock2.unlock();
lock1.unlock();
}else{
flag = true;
lock2.lock();
//再次获取lock1时 suspend
lock1.lock();
System.out.println("flag :false");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
lock1.unlock();
lock2.unlock();
}
super.run();
}
}
注意:不是每次运行都能看的效果,请思考下,如何看到我们想要的效果效果(请逐步调试)
分享到:
相关推荐
1. **获取锁:** 使用`SET`命令尝试设置一个key(比如`lock_key`),并设置一个过期时间,确保即使发生异常,锁也能自动释放。 2. **释放锁:** 当操作完成,使用`DEL`命令删除key。 3. **锁的公平性:** 防止死锁,...
3. 使用`Lock`的`tryLock()`方法配合`finally`块,可以确保即使在异常情况下也能正确释放锁,以维护_happens-before_关系。 _happens-before_关系在锁的释放与建立中的体现: 1. 一个线程解锁(`unlock()`)后,...
1. **高性能**:lock4j采用了高效的锁获取和释放机制,降低了与分布式协调器的通信开销,确保在高并发环境下依然保持良好的性能。 2. **可扩展性**:lock4j支持多种分布式协调器,如Zookeeper和Redis,开发者可以...
3. 正确释放锁:确保在所有可能的异常路径下都能正确解锁。 4. 使用超时:在尝试获取锁时设置超时,如果无法立即获取,线程可以暂时退出并稍后再试。 在实际应用中,还可以使用读写锁(read-write lock,即`pthread...
`Condition`接口是与`Lock`相关的条件变量,它扩展了监视器的概念,允许线程在满足特定条件时等待,而不仅仅是等待锁的释放。一个`Lock`可以关联多个`Condition`对象,这样就可以根据不同的条件进行分组等待,提高了...
只有拥有锁的进程才能调用此方法,否则会引发异常。 三、进程互斥锁Lock使用 案例一:不使用互斥锁的多进程示例 下面的代码创建了10个进程,每个进程运行函数`foo`,没有使用互斥锁。由于缺少锁的保护,输出显示...
3. **使用`using`语句块封装`Lock`**:这可以帮助确保在发生异常时也能正确地释放锁。 4. **避免嵌套锁**:尽量避免在一个已锁定的代码块内再次获取其他锁,这可能导致死锁。 5. **使用`try/finally`结构**:确保...
在finally块中释放锁可以确保锁最终被释放,即使发生异常情况。 Lock对象也可以用来实现读写锁(ReadWriteLock),这是Java中的一个高级锁机制。读写锁允许多个线程同时读取共享资源,但是写操作需要独占锁。这样可以...
2. 线程发生异常,JVM 会让线程自动释放锁。 lock 释放锁: ReentrantLock 加锁(lock())、释放锁(unlock()) ### 5. 解释说明 有了 synchronized 关键字,为什么还需要 lock 这个接口类呢?synchronized 的...
但是,synchronized有一些局限性,比如不能精确控制锁的获取与释放,以及无法知道是否成功获取锁等。 为了解决这些问题,Java提供了`java.util.concurrent.locks`包,其中的`Lock`接口提供了一种更细粒度的锁控制。...
在上面的示例中,`with my_lock:`语句确保了在同一时刻只有一个线程可以执行其内的代码,其他试图获取锁的线程会被阻塞,直到持有锁的线程释放它。 除了基本的锁,Python还提供了可重入锁(Reentrant Lock),也...
在尝试获取锁时,应将代码放入try-finally块中,以确保无论发生什么异常,都能正确释放锁。基本用法如下: ```java Lock lock = new ReentrantLock(); lock.lock(); try { doSomething(); } finally { lock....
这个例子中,`lock()`方法尝试获取锁,`unlock()`方法释放锁。注意,实际应用中需要考虑异常处理和锁的公平性(即等待最久的客户端优先获取锁)等问题。 通过使用`imadcn-redislock-998aa80`这个项目,开发者可以...
- 锁释放:确保在所有可能的异常情况下都能正确释放锁,避免资源泄漏。 - 避免阻塞:尽量减少锁的持有时间,降低对系统性能的影响。 8. **扩展与优化** - 使用队列处理异步任务,避免同步锁的使用,提高系统响应...
5. **Lock与Monitor的区别** `Monitor`类提供了`Enter`和`Exit`方法,实际上这两个方法是`lock`关键字的底层实现。`Monitor`提供了更多的高级功能,如`TryEnter`(尝试获取锁)、`Wait`(释放锁并挂起当前线程)和`...
### 彻底理解 Oracle 中 Library Cache Lock 的成因与解决办法 #### 一、引言 在日常数据库管理工作中,经常会遇到一些让人头疼的问题,比如会话挂起(hang)。其中一个常见的情况是当用户尝试执行某些操作时,比如...
Lock会自动释放锁,即使在出现异常时也能保证线程安全。 其次,Monitor也是C#中实现线程同步的一种方式,它提供了更多的控制选项,如TryEnter、Exit等。Monitor与Lock的关系是,Lock实际上是Monitor的一个简化版本...
3. 锁超时:每个锁都有超时设置,以防客户端异常导致锁无法释放。 在SpringBoot项目中整合Redisson,我们需要以下几个步骤: 1. 添加Redisson和Spring Boot的Redis starter依赖到`pom.xml`文件。 2. 配置Redisson...