首页 > 其他分享 >lock和try-finally语句块的正确写法

lock和try-finally语句块的正确写法

时间:2023-05-13 11:33:28浏览次数:34  
标签:语句 int lock unlock try finally

  1. lock()方法必须写在try语句块之外;
  2. lock()方法和try语句块之间,不能有其他代码,避免其他代码遇到异常,导致unlock()方法得不到执行,锁无法释放;
  3. unlock()方法必须写在finally语句块的第1行,避免其他代码遇到异常,导致unlock()方法得不到执行,锁无法释放;
package com.yang.service;

import java.util.concurrent.locks.ReentrantLock;

/**
 * @description: lock和try-finally语句块的正确写法:
 * <p>
 * 1.lock()方法必须写在try语句块之外;
 * 2.lock()方法和try语句块之间,不能有其他代码,避免其他代码遇到异常,导致unlock()方法得不到执行,锁无法释放;
 * 3.unlock()方法必须写在finally语句块的第1行,避免其他代码遇到异常,导致unlock()方法得不到执行,锁无法释放;
 * 
 * @author: Yang JianXiong
 * @since: 2023/5/13
 */
public class LockAndTry {

    /**
     * 锁对象
     */
    private static final ReentrantLock lock = new ReentrantLock();

    /**
     * 正确的写法:
     * 首先,lock()写在try语句块之外。
     * 其次,lock()和try语句块之间没有其他语句。
     * 再者,unlock()必须写在finally语句块的第1行。
     */
    private static void good() {
        int prepare = 1 / 0;
        lock.lock();
        try {
            int processBiz = 1 / 0;
        } finally {
            lock.unlock();
            int releaseResource = 1 / 0;
        }
    }

    /**
     * 错误一:lock()写在try语句块内部,且不为try的第1行:
     * 由于int processBiz = 1 / 0抛出异常,lock.lock()得不到执行,
     * 但是finally块内的unlock()必然会执行,
     * 由于当前线程还未获得该锁,故unlock()会抛出异常
     * 此异常会覆盖掉int processBiz = 1 / 0语句的异常信息
     * 导致真正的异常信息丢失
     */
    private static void bad1() {
        int prepare = 1 / 1;
        try {
            int processBiz = 1 / 0;
            lock.lock();
        } finally {
            lock.unlock();
            int releaseResource = 1 / 0;
        }
    }

    /**
     * 错误二:lock()写在try语句块内部,且是try的第1行:
     * lock()语句在获取锁时,可能抛出异常
     * 但是finally块内的unlock()必然会执行,
     * 由于当前线程还未获得该锁,故unlock()会抛出异常
     */
    private static void bad2() {
        int prepare = 1 / 1;
        try {
            lock.lock();  // 可能抛异常
            int processBiz = 1 / 0;
        } finally {
            lock.unlock();
            int releaseResource = 1 / 0;
        }
    }

    /**
     * 错误三:lock()写在try语句块之外,但之间有int prepare = 1 / 0语句
     * int prepare = 1 / 0抛出异常,后续代码将不会执行,
     * 锁将得不到释放
     */
    private static void bad3() {
        lock.lock();
        int prepare = 1 / 0;
        try {
            int processBiz = 1 / 0;
        } finally {
            lock.unlock();
            int releaseResource = 1 / 0;
        }
    }

    /**
     * 错误四:finally语句块内的lock()不是第1行
     * 若int releaseResource = 1 / 0语句抛出异常
     * 锁将得不到释放
     */
    private static void bad4() {
        int prepare = 1 / 1;
        lock.lock();
        try {
            int processBiz = 1 / 0;
        } finally {
            int releaseResource = 1 / 0;
            lock.unlock();
        }
    }

}

标签:语句,int,lock,unlock,try,finally
From: https://www.cnblogs.com/JaxYoun/p/17397015.html

相关文章

  • blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on th
    现在的浏览器出于安全策略的限制,都是不允许跨域的,但是开发的时候经常需要一些别的域的接口,特别是一些接口不是自己能控制的时候,往往会造成开发困难。今天无意中知道了,chrome浏览器可以通过设置为可跨域,解决跨域问题,从而在本地进行开发工作下面我就介绍谷歌浏览器新老版本各自的......
  • ubutun 配置SSH,报Permission denied please try again
    报错 解决 修改配置文件,在终端输入gedit/etc/ssh/sshd_config将PermitRootLogin配成yes 重启SSH服务,servicesshrestart再终端执行sshlocalhost ......
  • 解决 apt-get Could not get lock /var/lib/dpkg/lock-frontend , it is held by proc
    问题: 用lsof命令看看这几个文件是被哪个进程锁住的啊,然后先杀掉那几个进程。不杀进程,直接移除文件的话,可能仍有其他进程在操作apt的缓存,多个命令同时写apt缓存很容易发生冲突sudolsof/var/lib/dpkg/lock-frontend 杀掉进程kill-98798 ......
  • Python try...catch All In One
    Pythontry...catchAllInOnePython异常处理try...exceptwhileTrue:try:x=int(input("Pleaseenteranumber:"))breakexceptValueError:print("Oops!Thatwasnovalidnumber.Tryagain...")excep......
  • Java中try...catch...finally、throw和throws的区别和联系
    在Java中经常使用的对异常的处理有:try...catch...finally、throw和throws之前使用的时候经常混淆今天花时间梳理了一下1.try...catch...finallytry中存放可能出现异常的代码,catch处理try中抛出的异常inti=0;try{System.out.println("开始......
  • Added non-passive event listener to a scroll-blocking 'mousewheel' event. Consid
    这个警告意味着在事件监听器中,添加了一个阻止页面滚动的`mousewheel`事件,但是该事件监听器并没有标记为被动事件监听器(passiveeventlistener)。这可能会导致页面滚动变得不流畅,特别是在移动设备上。为了解决这个问题,您需要将事件监听器标记为被动事件监听器。具体实现方法如下......
  • KingbaseES V8R6 等待事件之LWLock Buffer_IO
    等待事件含义当进程同时尝试访问相同页面时,等待其他进程完成其输入/输出(I/O)操作时,会发生LWLock:BufferIO等待事件。其目的是将同一页读取到共享缓冲区中。每个共享缓冲区都有一个与LWLock:BufferIO等待事件相关联的I/O锁,每次都必须在共享缓冲区外部检索页。此锁用于处理多个会......
  • 聊一聊 dotnet-trace 调查 lock锁竞争
    一:背景1.讲故事最近在分析一个linux上的dump,最后的诱因是大量的lock锁诱发的高频上下文切换,虽然问题告一段落,但我还想知道一点信息,所谓的高频到底有多高频?锁竞争到底是一个怎样的锁竞争?如果了解这些信息对我们后续分析此类问题非常有帮助。要想获取此类信息,看dump肯定是......
  • atomically try catch and avoid throw exception
    #include<assert.h>#include<atomic>#include<chrono>#include<fstream>#include<iomanip>#include<iostream>#include<numeric>#include<thread>#include<unistd.h>#include<uuid/uuid.h>......
  • Linux运行卡死【INFO: task multipathd:5832 blocked for more than 120 seconds】
    目录问题背景分析过程解决方法问题背景系统在正常运行过程中,突然收到监控平台告警,服务器无法ping通。分析过程机房人员重启服务器后,查看/var/log/messages日志发现如下报错:May619:43:45xxxkernel:INFO:taskmultipathd:5832blockedformorethan120seconds.M......