synchronized 获取的锁,在方法抛出异常的时候会自动解锁
package com.horizon.thread.synchronize;
/**
* function:主要演示了 synchronized 获取的锁,在方法抛出异常的时候会自动解锁
* @author <a href="wangxinchun@yahoo.com.cn">新春.王</a>
*
*/
public class SynchronizeException extends Thread{
private static volatile boolean flag = true;
private A a;
private B b;
public static void main(String[] args) {
A a = new A();
B b = new B();
new SynchronizeException(a,b).start();
new SynchronizeException(a,b).start();
}
public SynchronizeException(A a,B b) {
this.a = a;
this.b = b;
}
@Override
public void run() {
if(flag){
flag = false;
a.a1();
b.b1();
}else{
flag = true;
b.b1();
a.a1();
}
}
}
class A {
public synchronized void a1() {
// 此处可以设置断点,两个线程只有一个可以执行
System.out.println(Thread.currentThread()+"a1");
if(true){
throw new NumberFormatException();
}
}
}
class B {
public synchronized void b1() {
System.out.println(Thread.currentThread()+"b1");
}
}
注意:要想看到效果必须逐步调试按照特定的步骤才能保证看到效果
另外:class B 的方法是为了其他功能而设计的,请只需关注class A即可
注意:ReentrantLock 获取的锁,异常的时候也不会自动释放!
分享到:
相关推荐
本篇文章将深入探讨Java锁的释放与建立,以及它们之间的_happens-before_关系,旨在帮助开发者更好地理解和应用并发控制。 首先,Java中的锁主要包括两种类型:内置锁(也称为监视器锁)和显式锁。内置锁是通过`...
这样,当一个线程进入`sale()`方法并获取锁之后,其他尝试调用`sale()`的线程必须等待,直到当前线程完成并释放锁。 2. **同步代码块**: 如果我们只想锁定代码的一部分,可以使用同步代码块,格式如下: ```...
如果当前线程没有持有锁,则抛出`IllegalMonitorStateException`异常。 ```java synchronized (lock) { // 执行一些操作 lock.notify(); // 唤醒一个等待线程 } ``` #### 3. `notifyAll()` `notifyAll()`方法...
Synchronized具有自动释放锁的特点,当线程执行完毕或遇到异常时,锁会自动释放,无需程序员显式调用解锁操作。然而,这也意味着Synchronized不具备显式的锁获取和释放控制,可能导致一些复杂情况下的锁管理不便。 ...
- 使用`ReentrantLock`时,必须显式地在`finally`块中释放锁,以防止由于异常而导致的锁未释放问题。 - `ReentrantLock`支持重入特性,即允许同一个线程多次获取同一把锁,这与`synchronized`的行为一致。 #### ...
- `ReentrantLock`需要显式地调用`lock()`和`unlock()`方法来获取和释放锁,且建议使用`try-finally`结构确保锁的释放,以防止异常导致的锁未释放问题。 总的来说,如果`synchronized`能满足需求,应优先使用,...
* synchronized 修饰的方法,无论方法正常执行完毕还是抛出异常,都会释放锁。 synchronized 关键字的应用 synchronized 关键字可以应用在方法和代码块中,以实现互斥同步原语。例如,在多线程环境中,使用 ...
- 自动释放锁,当线程执行完同步代码块或方法后,会自动释放锁。 4. **局限性**: - 不支持公平锁,即线程获取锁的顺序并不总是按照它们请求锁的时间顺序进行。 - 无法中断正在等待获取锁的线程,除非抛出异常...
2. 线程发生异常,JVM 会让线程自动释放锁。 lock 释放锁: ReentrantLock 加锁(lock())、释放锁(unlock()) ### 5. 解释说明 有了 synchronized 关键字,为什么还需要 lock 这个接口类呢?synchronized 的...
- **线程退出**:线程执行完同步代码后自动释放锁,或者在执行过程中遇到`return`、`throw`异常时也会释放锁。 6. **死锁问题** 过度使用`synchronized`可能导致死锁,即两个或多个线程互相等待对方释放资源而无法...
也就是说,当一个线程进入一个对象的`synchronized`代码块或方法时,其他线程对这个对象的`synchronized`代码块或方法的访问将会被阻塞,直到当前线程执行完毕并释放锁。 2. **synchronized的两种使用方式** - **...
1. 成功案例:正确使用`synchronized`,确保共享资源在并发环境下的安全访问,避免数据异常。 2. 失败案例:未使用或错误使用`synchronized`,导致线程安全问题,如死锁、竞态条件等。 五、线程安全问题 1. 死锁:...
6. **synchronized与 volatile 的区别**: - `volatile`主要保证变量的可见性和有序性,但无法保证原子性,而`synchronized`则能保证原子性、可见性和有序性。 - `volatile`适用于读多写少的情况,而`synchronized...
"Synchronized与Lock"这个主题探讨了两种主要的同步机制:synchronized关键字和Lock接口(包括其实现类如ReentrantLock)。这两种机制都用于实现线程间的互斥访问,但它们在功能、灵活性和性能上有所差异。 首先,...
当一个线程进入由`synchronized`修饰的方法或代码块时,其他试图进入同一锁的线程将被阻塞,直到该线程完成其操作并释放锁。 在这个生产者消费者项目中,主要涉及以下几个关键知识点: 1. **线程间通信**:生产者...
如果线程在执行过程中被中断或抛出异常,JVM也会自动执行`monitorexit`指令来释放锁。 ### 同步方法 同步方法的语法如下: ```java public synchronized void method() { // 需要同步的代码 } ``` 这里,整个方法...
当函数退出时,无论是否发生异常,锁都会自动释放。这是一种防止死锁和资源泄露的好方法。 除了`std::lock_guard`,还可以使用`std::unique_lock`,它提供了更多的灵活性,比如可以手动解锁或者尝试不阻塞地获取锁...
4. **异常与锁释放** 当线程在执行`synchronized`方法或块时遇到异常并抛出,即使没有显示地调用`unlock()`,Java虚拟机也会自动释放当前线程持有的所有锁,这有助于防止死锁。 总结来说,`synchronized`关键字在...
与synchronized相比,提供了更多的控制选项,如公平锁(按照等待时间分配锁)和非公平锁(不保证等待时间),以及tryLock()方法允许尝试获取锁而不阻塞,以及lockInterruptibly()方法允许通过中断来释放锁。...
1. synchronized关键字:用于实现互斥锁,如果出现异常,会自动释放锁,防止死锁。 2. try-catch-finally:在同步代码块或方法中使用异常处理结构,确保finally块中的代码(如锁的释放)始终被执行。 3. 使用try-...