美文网首页
线程抛出异常会释放锁吗?

线程抛出异常会释放锁吗?

作者: 好奇害死猫o | 来源:发表于2018-12-23 14:35 被阅读0次

在程序执行的过程中如果出现异常默认锁会被释放,在并发处理的过程中,有异常的情况需要多加小心,可能会出现数据不一致的情况,多个servlet线程访问同一个资源时,如果第一个线程抛出异常,其他线程就会进入同步代码块,有可能会访问到异常产生时的数据,出现数据不一致的情况。

import java.util.concurrent.TimeUnit;

public class T {
    int count = 0;
    synchronized void m() {
        System.out.println(Thread.currentThread().getName() + " start");
        while(true) {
            count ++;
            System.out.println(Thread.currentThread().getName() + " count = " + count);
            try {
                TimeUnit.SECONDS.sleep(1);
                
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
            if(count == 5) {
                int i = 1/0; //此处抛出异常,锁将被释放,要想不被释放,可以在这里进行catch,然后让循环继续
            }
        }
    }
    
    public static void main(String[] args) {
        T t = new T();
        Runnable r = new Runnable() {
            @Override
            public void run() {
                t.m();
            }
        };
        new Thread(r, "t1").start();
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(r, "t2").start();
    }
    
}

运行结果如下,t2线程已经正常启动,说明在t1线程抛出异常的时候已经将锁释放。

t1 start
t1 count = 1
t1 count = 2
t1 count = 3
t1 count = 4
t1 count = 5
t2 start
Exception in thread "t1" java.lang.ArithmeticException: / by zero
t2 count = 6
    at yxxy.c_011.T.m(T.java:28)
    at yxxy.c_011.T$1.run(T.java:38)
    at java.lang.Thread.run(Thread.java:748)
t2 count = 7
t2 count = 8
t2 count = 9
t2 count = 10
t2 count = 11
t2 count = 12
t2 count = 13

相关文章

  • 线程抛出异常会释放锁吗?

    在程序执行的过程中如果出现异常默认锁会被释放,在并发处理的过程中,有异常的情况需要多加小心,可能会出现数据不一致的...

  • 线程锁概念

    synchronized 和 volatile 使用 线程抛出异常,锁会被释放 如下demo 如果不想释放那把线程...

  • 史上最详细Java多线程面试题及答案!

    synchronized实现原理 当一个线程试图访问同步代码块时,他首先必须得到锁,退出或抛出异常时必须释放锁。那...

  • 并发Collections

    1.TimeUnit Thread.sleep() 是一个静态方法,暂停线程时它不会释放锁,该方法会抛出Inter...

  • synchronized

    java 底层提供的一种同步机制(关键字) 可重入(偏向锁时 当前线程可重入)异常会释放锁,如果不想被释放,可以c...

  • 系统

    锁 互斥锁 加锁如果已经有其他线程加锁了,则阻塞,如果有多个线程在等待锁的释放,在锁释放的时候,所有线程都会被唤醒...

  • 【C#】TransactionScope 超时的处理方式

    这个异常会在 Dispose时触发,而不是Complete,即使在规定时间内提交了,但如果释放时超时,依然会抛出异...

  • sleep()、 wait() 、yield() 、join()

    1、sleep()sleep()让当前线程进入阻塞状态,不会释放“锁” 2、 wait()会释放掉锁,让其他线程能...

  • AbstractQueuedSynchronizer 源码解析

    1 释放锁 释放锁的触发时机就是我们常用的Lock.unlock()方法,目的就是让线程释放对资源的访问权。释放锁...

  • Synchronized的原理分析

    Java多线程运行环境中,在哪些情况下会使对象锁释放?释放锁: 不释放锁的情况: interrupted()和is...

网友评论

      本文标题:线程抛出异常会释放锁吗?

      本文链接:https://www.haomeiwen.com/subject/ayknkqtx.html