`

异常与锁的释放(lock)

阅读更多
获取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();
	}
}




  注意:不是每次运行都能看的效果,请思考下,如何看到我们想要的效果效果(请逐步调试)
分享到:
评论
2 楼 王新春 2013-04-22  
zjuttsw 写道
所以在调用lock方法后,需要在finally语句块中调用unlock方法

对。
1 楼 zjuttsw 2013-02-17  
所以在调用lock方法后,需要在finally语句块中调用unlock方法

相关推荐

    C#实操控制并发之Lock和Redis分布式锁

    1. **获取锁:** 使用`SET`命令尝试设置一个key(比如`lock_key`),并设置一个过期时间,确保即使发生异常,锁也能自动释放。 2. **释放锁:** 当操作完成,使用`DEL`命令删除key。 3. **锁的公平性:** 防止死锁,...

    java锁的释放与建立

    3. 使用`Lock`的`tryLock()`方法配合`finally`块,可以确保即使在异常情况下也能正确释放锁,以维护_happens-before_关系。 _happens-before_关系在锁的释放与建立中的体现: 1. 一个线程解锁(`unlock()`)后,...

    lock4j高性能分布式锁 v2.2.5.zip

    1. **高性能**:lock4j采用了高效的锁获取和释放机制,降低了与分布式协调器的通信开销,确保在高并发环境下依然保持良好的性能。 2. **可扩展性**:lock4j支持多种分布式协调器,如Zookeeper和Redis,开发者可以...

    锁实现lock

    3. 正确释放锁:确保在所有可能的异常路径下都能正确解锁。 4. 使用超时:在尝试获取锁时设置超时,如果无法立即获取,线程可以暂时退出并稍后再试。 在实际应用中,还可以使用读写锁(read-write lock,即`pthread...

    java 锁 Lock接口详解.docx

    `Condition`接口是与`Lock`相关的条件变量,它扩展了监视器的概念,允许线程在满足特定条件时等待,而不仅仅是等待锁的释放。一个`Lock`可以关联多个`Condition`对象,这样就可以根据不同的条件进行分组等待,提高了...

    Python 进程互斥锁 Lock - Python零基础入门教程.pdf

    只有拥有锁的进程才能调用此方法,否则会引发异常。 三、进程互斥锁Lock使用 案例一:不使用互斥锁的多进程示例 下面的代码创建了10个进程,每个进程运行函数`foo`,没有使用互斥锁。由于缺少锁的保护,输出显示...

    C# Lock实例

    3. **使用`using`语句块封装`Lock`**:这可以帮助确保在发生异常时也能正确地释放锁。 4. **避免嵌套锁**:尽量避免在一个已锁定的代码块内再次获取其他锁,这可能导致死锁。 5. **使用`try/finally`结构**:确保...

    Java线程之锁对象Lock-同步问题更完美的处理方式代码实例

    在finally块中释放锁可以确保锁最终被释放,即使发生异常情况。 Lock对象也可以用来实现读写锁(ReadWriteLock),这是Java中的一个高级锁机制。读写锁允许多个线程同时读取共享资源,但是写操作需要独占锁。这样可以...

    java的lock和synchronized的区别.docx

    2. 线程发生异常,JVM 会让线程自动释放锁。 lock 释放锁: ReentrantLock 加锁(lock())、释放锁(unlock()) ### 5. 解释说明 有了 synchronized 关键字,为什么还需要 lock 这个接口类呢?synchronized 的...

    第四节(Lock关键字用法)

    但是,synchronized有一些局限性,比如不能精确控制锁的获取与释放,以及无法知道是否成功获取锁等。 为了解决这些问题,Java提供了`java.util.concurrent.locks`包,其中的`Lock`接口提供了一种更细粒度的锁控制。...

    Python应用实战:python多线程-多线程安全问题&lock与rlock.zip

    在上面的示例中,`with my_lock:`语句确保了在同一时刻只有一个线程可以执行其内的代码,其他试图获取锁的线程会被阻塞,直到持有锁的线程释放它。 除了基本的锁,Python还提供了可重入锁(Reentrant Lock),也...

    21 更高级的锁—深入解析Lock.pdf

    在尝试获取锁时,应将代码放入try-finally块中,以确保无论发生什么异常,都能正确释放锁。基本用法如下: ```java Lock lock = new ReentrantLock(); lock.lock(); try { doSomething(); } finally { lock....

    redislock-基于redis的分布式可重入锁

    这个例子中,`lock()`方法尝试获取锁,`unlock()`方法释放锁。注意,实际应用中需要考虑异常处理和锁的公平性(即等待最久的客户端优先获取锁)等问题。 通过使用`imadcn-redislock-998aa80`这个项目,开发者可以...

    Laravel开发-lock

    - 锁释放:确保在所有可能的异常情况下都能正确释放锁,避免资源泄漏。 - 避免阻塞:尽量减少锁的持有时间,降低对系统性能的影响。 8. **扩展与优化** - 使用队列处理异步任务,避免同步锁的使用,提高系统响应...

    Lock的使用.rar

    5. **Lock与Monitor的区别** `Monitor`类提供了`Enter`和`Exit`方法,实际上这两个方法是`lock`关键字的底层实现。`Monitor`提供了更多的高级功能,如`TryEnter`(尝试获取锁)、`Wait`(释放锁并挂起当前线程)和`...

    彻底搞清楚library cache lock的成因和解决方法

    ### 彻底理解 Oracle 中 Library Cache Lock 的成因与解决办法 #### 一、引言 在日常数据库管理工作中,经常会遇到一些让人头疼的问题,比如会话挂起(hang)。其中一个常见的情况是当用户尝试执行某些操作时,比如...

    C#不同锁性能比较

    Lock会自动释放锁,即使在出现异常时也能保证线程安全。 其次,Monitor也是C#中实现线程同步的一种方式,它提供了更多的控制选项,如TryEnter、Exit等。Monitor与Lock的关系是,Lock实际上是Monitor的一个简化版本...

    案例实战-SpringBoot整合Redisson实现RedLock分布式锁同步

    3. 锁超时:每个锁都有超时设置,以防客户端异常导致锁无法释放。 在SpringBoot项目中整合Redisson,我们需要以下几个步骤: 1. 添加Redisson和Spring Boot的Redis starter依赖到`pom.xml`文件。 2. 配置Redisson...

Global site tag (gtag.js) - Google Analytics