首页 > 其他分享 >synchronized、Lock 为什么要设计成可重入

synchronized、Lock 为什么要设计成可重入

时间:2023-05-17 20:22:16浏览次数:43  
标签:info enjoy log synchronized Lock 成可 lock public

为什么监视器锁(ObjectMonitor)、Lock 要设计成可重入的目的主要有两个

1、防止死锁

2、面向对象更好的封装代码

先看一段代码

@Slf4j
public class SynchronizedDemo {
    private static final Object lock = new Object();

    public static void main(String[] args) {
        synchronized (lock) {
            log.info("enjoy eat");
            synchronized (lock) {
                log.info("enjoy sleep");
            }
        }
    }
}

上述代码中,某个线程第一次成功获取到监视器锁之后,如果 monitor 是不可重入的,当该线程尝试去获取第二个锁的时候阻塞了,那么整个线程就会进入死锁状态,无法继续向下执行了

再看一段代码

@Slf4j
public class SynchronizedDemo {
    private static final Object lock = new Object();

    public static void main(String[] args) {
        synchronized (lock) {
            log.info("enjoy eat");
            synchronized (lock) {
                log.info("enjoy sleep");
                synchronized (lock){
                    log.info("do something");
                }
            }
        }
    }
}

上述代码只嵌套了三层锁对象,如果需要 10 次加锁呢,岂不是要写 10 层 synchronized(lock),很不优雅,也不好维护,并且不符合面向对象的编程思想

上述代码可以改造成如下,符合面向对象的编程思想

@Slf4j
public class SynchronizedDemo {
    public static void main(String[] args) {
        LockObject lock = new LockObject();
        lock.eat();
    }
}

@Slf4j
class LockObject {
    public synchronized void eat() {
        log.info("enjoy eat");
        sleep();
    }

    public synchronized void sleep() {
        log.info("enjoy sleep");
        doSomething();
    }

    public synchronized void doSomething() {
        log.info("do something");
    }
}

  

 

标签:info,enjoy,log,synchronized,Lock,成可,lock,public
From: https://www.cnblogs.com/xiaomaomao/p/17410051.html

相关文章

  • LinkedBlockingQueue源码分析
    1、LinkedBlockingQueue使用LinkedBlockingQueue的使用案例详情如下:1importjava.util.concurrent.LinkedBlockingDeque;2importjava.util.concurrent.LinkedBlockingQueue;34publicclassTestLinkedBlockingQueue{5publicstaticvoidmain(String[]......
  • 文件打包成可执行文件(exe)
    文件打包成可执行文件(exe)py文件打包步骤:第一步:安装打包所需要的包(pyinstaller)pipinstallpyinstaller第二步:找到.py文件所在的路径,cmd切换到该路径第三步:输入打包命令pyinstaller-F-w(-iicofile)文件名.py-w:表示在打包好程序后,不会出现黑色的命令窗口,此窗口是用......
  • python 项目报错 Fatal Python error: _enter_buffered_busy: could not acquire lock
    FatalPythonerror:_enter_buffered_busy:couldnotacquirelockfor<_io.BufferedWritername=''>atinterpretershutdown,possiblyduetodaemonthreadsPythonruntimestate:finalizing(tstate=0x00005654c4008a40)Currentthread0x00007fc......
  • [未解决] 如何用vite的vueCustomBlockTransforms实现源代码展示
    想实现源代码展示,搜索结果90%都是用vueCustomBlockTransforms,但我在自己项目的vite.config.js里加入该选项以后并没有生效在vite官网配置中也没有,vite源码中没有(但是node/server的createServer中有)找到了一个demo,也是可以用的(虽然vite版本是很早的1.0):https://zhuanlan.zhihu.co......
  • 【Mysql】update时报错:Lock wait timeout exceeded; try restarting transaction
    1、查找正在执行的事务SELECT*FROMinformation_schema.INNODB_TRX;2、杀掉LOCKWAIT的进程trx_mysql_thread_id:进程idkillxxxOR3、查看所有进程SHOWPROCESSLIST;4、杀掉异常的进程,比如Sleep状态、影响你正在操作的业务的进程id:进程idkillxxx......
  • LockSuport
    是JUC的核心之一,AQS的await()、signal()等方法底层就是LockSuport实现的实现线程挂起和唤醒的操作,和每个线程关联一个许可(permit),核心方式就是park和unpark,底层是Unsafe类的native方法实现;类似object的wait和notify/notifyAll方法核心方法方法解释......
  • mysql用户表root用户被锁定,无法登陆(Account is locked)
    今天看到mysql的user表就打开了看看,看到root还有些权限是N,然后顺手就改成了Y,结果保存之后就凉凉了,数据库就打不开了,报“Accountislocked”这个错误,上网排查了好半天才解决,解决方法记录一下。解决思路:1、使用skip-grant-tables跳过密码验证,此时可以打开MySQL服务并登录2、......
  • lock和try-finally语句块的正确写法
    lock()方法必须写在try语句块之外;lock()方法和try语句块之间,不能有其他代码,避免其他代码遇到异常,导致unlock()方法得不到执行,锁无法释放;unlock()方法必须写在finally语句块的第1行,避免其他代码遇到异常,导致unlock()方法得不到执行,锁无法释放;packagecom.yang.service;impor......
  • blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on th
    现在的浏览器出于安全策略的限制,都是不允许跨域的,但是开发的时候经常需要一些别的域的接口,特别是一些接口不是自己能控制的时候,往往会造成开发困难。今天无意中知道了,chrome浏览器可以通过设置为可跨域,解决跨域问题,从而在本地进行开发工作下面我就介绍谷歌浏览器新老版本各自的......
  • 17.如何将py文件打包成可执行文件exe格式
     首先需要通过pip安装pyinstallerpipinstallpyinstaller在相应的要打包的py文件夹下执行:pyinstaller-F-wlogin2.py会生成一个dist文件夹,里面就是打包好的exe ......