获取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();
}
}
注意:不是每次运行都能看的效果,请思考下,如何看到我们想要的效果效果(请逐步调试)
分享到:
相关推荐
java多线程之lock。 Lock的基本用法如下,为了防止异常退出时没有释放锁,一般都在拿到锁后立马try,try住所有临界区的代码,然后finally释放锁。
* 避免死锁:这把锁在一段有限的时间之后,一定会被释放(正常释放或异常释放) * 高可用:获取或释放锁的机制必须高可用且性能佳 9 锁和事务的区别? 1)锁: 单进程的系统中,存在多线程同时操作一个公共变量,此时...
Monitor对象1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁无法释放,所以需要在try{} catch(){}之后...
依赖锁的代码应该保证当出现异常时可以正常的释放锁。 典型代码如下: try: lock.acquire() #关键部分 ... finally: lock.release() 另外,所有种类的锁还支持上下文管理协议(写起来更简洁): with语句自动...
with_advisory_lock 与或一起使用时,将ruby 2.4、2.5和2.6的咨询... 即使在块中引发了异常,锁定也会在块结束后释放。 锁定等待超时 with_advisory_lock将选项哈希作为第二个参数。 timeout_seconds选项默认为nil ,
在创建key的时候加入了ttl,防止因为进程异常退出而没有释放锁。更新:支持指定renew时间renew(ttl=3)待修复的问题:针对etcd key 加入watch机制,解决客户端意外退出没有释放锁的问题.曾经写过关于分布式互斥锁的文章:...
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。 sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。 notify():唤醒一个处于等待状态的线程...
// 索引写入完成之后,要释放写锁 this.writeLock = null; throw e; } } 通过IndexWriter索引器的构造函数,以及它初始化时调用的一个init方法,可以了解一个IndexWriter索引器的构造最重要的是在init方法中的...
这个问题,字面意思是程序发生死锁了,它会导致w3wp进程重启。... 这行代码是有问题的,如果在DoSomething()方法执行中发生一次异常,这个写锁就释放不了了,再次请求时就会等待直到超时,在多线程的情况下就会发
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 ...
答:wait():使一个线程处于等待状态,并且释放所持有的对象的lock。 sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。 notify():唤醒一个处于等待状态的线程...
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 ...
8、运行时异常与一般异常有何异同? 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常...
5、运行时异常与一般异常有何异同? 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,...
21.4 使用终结操作来释放本地资源 21.4.1 使用CriticalFinalizerObject类型确保终结 21.4.2 SafeHandle类型及其派生类型 21.4.3 使用SafeHandle类型与非托管代码进行互操作 21.5 对托管资源使用终结操作 21.6 ...
21.4 使用终结操作来释放本地资源 21.4.1 使用CriticalFinalizerObject类型确保终结 21.4.2 SafeHandle类型及其派生类型 21.4.3 使用SafeHandle类型与非托管代码进行互操作 21.5 对托管资源使用终结操作 21.6 ...
21.4 使用终结操作来释放本地资源 21.4.1 使用CriticalFinalizerObject类型确保终结 21.4.2 SafeHandle类型及其派生类型 21.4.3 使用SafeHandle类型与非托管代码进行互操作 21.5 对托管资源使用终结操作 21.6 ...
21.4 使用终结操作来释放本地资源 21.4.1 使用CriticalFinalizerObject类型确保终结 21.4.2 SafeHandle类型及其派生类型 21.4.3 使用SafeHandle类型与非托管代码进行互操作 21.5 对托管资源使用终结操作 21.6 ...
手动步进窗口中小键盘上快捷键功能不再受数字锁的影响 V5.4.10 更正了TraceView偶尔不能及时刷新的错误 改进了MaskEdit的编辑性能 把复位的快捷键设为F12 V5.4.11 更正了暂停继续时主轴启动没有延时的错误 ...
手动步进窗口中小键盘上快捷键功能不再受数字锁的影响 V5.4.10 更正了TraceView偶尔不能及时刷新的错误 改进了MaskEdit的编辑性能 把复位的快捷键设为F12 V5.4.11 更正了暂停继续时主轴启动没有延时的错误 ...