`

异常与锁的释放(synchronized )

阅读更多
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锁的释放与建立

    本篇文章将深入探讨Java锁的释放与建立,以及它们之间的_happens-before_关系,旨在帮助开发者更好地理解和应用并发控制。 首先,Java中的锁主要包括两种类型:内置锁(也称为监视器锁)和显式锁。内置锁是通过`...

    Java 同步锁(synchronized)详解及实例

    这样,当一个线程进入`sale()`方法并获取锁之后,其他尝试调用`sale()`的线程必须等待,直到当前线程完成并释放锁。 2. **同步代码块**: 如果我们只想锁定代码的一部分,可以使用同步代码块,格式如下: ```...

    synchronized 的理解

    如果当前线程没有持有锁,则抛出`IllegalMonitorStateException`异常。 ```java synchronized (lock) { // 执行一些操作 lock.notify(); // 唤醒一个等待线程 } ``` #### 3. `notifyAll()` `notifyAll()`方法...

    简单聊聊Synchronized和ReentrantLock锁.docx

    Synchronized具有自动释放锁的特点,当线程执行完毕或遇到异常时,锁会自动释放,无需程序员显式调用解锁操作。然而,这也意味着Synchronized不具备显式的锁获取和释放控制,可能导致一些复杂情况下的锁管理不便。 ...

    ReentrantLock 与 synchronized 简介

    - 使用`ReentrantLock`时,必须显式地在`finally`块中释放锁,以防止由于异常而导致的锁未释放问题。 - `ReentrantLock`支持重入特性,即允许同一个线程多次获取同一把锁,这与`synchronized`的行为一致。 #### ...

    22 到底哪把锁更适合你?—synchronized与ReentrantLock对比.pdf

    - `ReentrantLock`需要显式地调用`lock()`和`unlock()`方法来获取和释放锁,且建议使用`try-finally`结构确保锁的释放,以防止异常导致的锁未释放问题。 总的来说,如果`synchronized`能满足需求,应优先使用,...

    Java 多线程与并发(4-26)-关键字- synchronized详解.pdf

    * synchronized 修饰的方法,无论方法正常执行完毕还是抛出异常,都会释放锁。 synchronized 关键字的应用 synchronized 关键字可以应用在方法和代码块中,以实现互斥同步原语。例如,在多线程环境中,使用 ...

    ReentrantLock与synchronized

    - 自动释放锁,当线程执行完同步代码块或方法后,会自动释放锁。 4. **局限性**: - 不支持公平锁,即线程获取锁的顺序并不总是按照它们请求锁的时间顺序进行。 - 无法中断正在等待获取锁的线程,除非抛出异常...

    java的lock和synchronized的区别.docx

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

    java synchronized详解

    - **线程退出**:线程执行完同步代码后自动释放锁,或者在执行过程中遇到`return`、`throw`异常时也会释放锁。 6. **死锁问题** 过度使用`synchronized`可能导致死锁,即两个或多个线程互相等待对方释放资源而无法...

    [JAVA][synchronized的使用]

    也就是说,当一个线程进入一个对象的`synchronized`代码块或方法时,其他线程对这个对象的`synchronized`代码块或方法的访问将会被阻塞,直到当前线程执行完毕并释放锁。 2. **synchronized的两种使用方式** - **...

    Android synchronized 测试案例

    1. 成功案例:正确使用`synchronized`,确保共享资源在并发环境下的安全访问,避免数据异常。 2. 失败案例:未使用或错误使用`synchronized`,导致线程安全问题,如死锁、竞态条件等。 五、线程安全问题 1. 死锁:...

    java synchronized demo

    6. **synchronized与 volatile 的区别**: - `volatile`主要保证变量的可见性和有序性,但无法保证原子性,而`synchronized`则能保证原子性、可见性和有序性。 - `volatile`适用于读多写少的情况,而`synchronized...

    Synchronized与Lock

    "Synchronized与Lock"这个主题探讨了两种主要的同步机制:synchronized关键字和Lock接口(包括其实现类如ReentrantLock)。这两种机制都用于实现线程间的互斥访问,但它们在功能、灵活性和性能上有所差异。 首先,...

    生产者消费者Java—synchronized 机制

    当一个线程进入由`synchronized`修饰的方法或代码块时,其他试图进入同一锁的线程将被阻塞,直到该线程完成其操作并释放锁。 在这个生产者消费者项目中,主要涉及以下几个关键知识点: 1. **线程间通信**:生产者...

    并发编程原理学习:synchronized关键字.doc

    如果线程在执行过程中被中断或抛出异常,JVM也会自动执行`monitorexit`指令来释放锁。 ### 同步方法 同步方法的语法如下: ```java public synchronized void method() { // 需要同步的代码 } ``` 这里,整个方法...

    [并发并行]_[初级]_[C++实现sychronized方式的对象锁]

    当函数退出时,无论是否发生异常,锁都会自动释放。这是一种防止死锁和资源泄露的好方法。 除了`std::lock_guard`,还可以使用`std::unique_lock`,它提供了更多的灵活性,比如可以手动解锁或者尝试不阻塞地获取锁...

    Java多线程synchronized同步方法详解

    4. **异常与锁释放** 当线程在执行`synchronized`方法或块时遇到异常并抛出,即使没有显示地调用`unlock()`,Java虚拟机也会自动释放当前线程持有的所有锁,这有助于防止死锁。 总结来说,`synchronized`关键字在...

    java锁机制详解.pdf

    与synchronized相比,提供了更多的控制选项,如公平锁(按照等待时间分配锁)和非公平锁(不保证等待时间),以及tryLock()方法允许尝试获取锁而不阻塞,以及lockInterruptibly()方法允许通过中断来释放锁。...

    线成同步异常处理

    1. synchronized关键字:用于实现互斥锁,如果出现异常,会自动释放锁,防止死锁。 2. try-catch-finally:在同步代码块或方法中使用异常处理结构,确保finally块中的代码(如锁的释放)始终被执行。 3. 使用try-...

Global site tag (gtag.js) - Google Analytics