`

异常与锁的释放(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方法

相关推荐

    Lock总结.doc

    java多线程之lock。 Lock的基本用法如下,为了防止异常退出时没有释放锁,一般都在拿到锁后立马try,try住所有临界区的代码,然后finally释放锁。

    第九讲:分布式锁的原理及应用&秒杀设计实现.pdf

    * 避免死锁:这把锁在一段有限的时间之后,一定会被释放(正常释放或异常释放) * 高可用:获取或释放锁的机制必须高可用且性能佳 9 锁和事务的区别? 1)锁: 单进程的系统中,存在多线程同时操作一个公共变量,此时...

    C#中Monitor对象与Lock关键字的区别分析

    Monitor对象1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁无法释放,所以需要在try{} catch(){}之后...

    Python线程下使用锁的技巧分享

    依赖锁的代码应该保证当出现异常时可以正常的释放锁。 典型代码如下: try: lock.acquire() #关键部分 ... finally: lock.release() 另外,所有种类的锁还支持上下文管理协议(写起来更简洁): with语句自动...

    with_advisory_lock:ActiveRecord的建议锁定

    with_advisory_lock 与或一起使用时,将ruby 2.4、2.5和2.6的咨询... 即使在块中引发了异常,锁定也会在块结束后释放。 锁定等待超时 with_advisory_lock将选项哈希作为第二个参数。 timeout_seconds选项默认为nil ,

    pyetcdlock:基于etcd的互斥网络锁

    在创建key的时候加入了ttl,防止因为进程异常退出而没有释放锁。更新:支持指定renew时间renew(ttl=3)待修复的问题:针对etcd key 加入watch机制,解决客户端意外退出没有释放锁的问题.曾经写过关于分布式互斥锁的文章:...

    JAVA面试题集合面试技能大全

    wait():使一个线程处于等待状态,并且释放所持有的对象的lock。 sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。 notify():唤醒一个处于等待状态的线程...

    基于JAVA的搜索引擎 lucene-2.2.0

    // 索引写入完成之后,要释放写锁 this.writeLock = null; throw e; } } 通过IndexWriter索引器的构造函数,以及它初始化时调用的一个init方法,可以了解一个IndexWriter索引器的构造最重要的是在init方法中的...

    w3wp进程发生死锁ISAPI aspnet_isapi.dll报告它自身有问题,原因Deadlock detected

    这个问题,字面意思是程序发生死锁了,它会导致w3wp进程重启。... 这行代码是有问题的,如果在DoSomething()方法执行中发生一次异常,这个写锁就释放不了了,再次请求时就会等待直到超时,在多线程的情况下就会发

    深入解析Oracle.DBA入门进阶与诊断案例

    9.5.6 Latch Free(闩锁释放) 462 9.5.7 Oracle 10g/11g Latch机制的变化 467 第10章 性能诊断与SQL优化 471 10.1 使用AUTOTRACE功能辅助SQL优化 471 10.1.1 AUTOTRACE功能的启用 471 10.1.2 Oracle 10g ...

    java笔试题大集合及答案(另附各大公司笔试题)

    答:wait():使一个线程处于等待状态,并且释放所持有的对象的lock。 sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。 notify():唤醒一个处于等待状态的线程...

    疯狂JAVA讲义

    10.3 Checked异常和Runtime异常体系 367 10.3.1 使用throws声明抛出异常 367 10.4 使用throw抛出异常 369 10.4.1 抛出异常 369 10.4.2 自定义异常类 371 10.4.3 catch和throw同时使用 371 10.4.4 异常链 373 ...

    超级有影响力霸气的Java面试题大全文档

    8、运行时异常与一般异常有何异同?  异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常...

    java 面试题 总结

    5、运行时异常与一般异常有何异同? 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    21.4 使用终结操作来释放本地资源 21.4.1 使用CriticalFinalizerObject类型确保终结 21.4.2 SafeHandle类型及其派生类型 21.4.3 使用SafeHandle类型与非托管代码进行互操作 21.5 对托管资源使用终结操作 21.6 ...

    CLR.via.C#.(中文第3版)(自制详细书签)

    21.4 使用终结操作来释放本地资源 21.4.1 使用CriticalFinalizerObject类型确保终结 21.4.2 SafeHandle类型及其派生类型 21.4.3 使用SafeHandle类型与非托管代码进行互操作 21.5 对托管资源使用终结操作 21.6 ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    21.4 使用终结操作来释放本地资源 21.4.1 使用CriticalFinalizerObject类型确保终结 21.4.2 SafeHandle类型及其派生类型 21.4.3 使用SafeHandle类型与非托管代码进行互操作 21.5 对托管资源使用终结操作 21.6 ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    21.4 使用终结操作来释放本地资源 21.4.1 使用CriticalFinalizerObject类型确保终结 21.4.2 SafeHandle类型及其派生类型 21.4.3 使用SafeHandle类型与非托管代码进行互操作 21.5 对托管资源使用终结操作 21.6 ...

    NCStudio 5.4.49

    手动步进窗口中小键盘上快捷键功能不再受数字锁的影响 V5.4.10 更正了TraceView偶尔不能及时刷新的错误 改进了MaskEdit的编辑性能 把复位的快捷键设为F12 V5.4.11 更正了暂停继续时主轴启动没有延时的错误 ...

    维宏Ncstudio V5.4.57

    手动步进窗口中小键盘上快捷键功能不再受数字锁的影响 V5.4.10 更正了TraceView偶尔不能及时刷新的错误 改进了MaskEdit的编辑性能 把复位的快捷键设为F12 V5.4.11 更正了暂停继续时主轴启动没有延时的错误 ...

Global site tag (gtag.js) - Google Analytics