• Synchronized同步锁


    一、什么是Synchronized同步锁

    简单来说,就是使用Synchronized关键字将一段代码逻辑,用一把锁锁起来,只有获得这一把锁的线程才能访问,并且,同一时刻,只有这一个线程持有这把锁,这样就保证了同一时刻只有一个线程能执行被锁住的代码,从而确保代码的线程安全

    二、什么是锁? 

    每一个Java对象都可以充当一个实现同步的锁。其中, 括号里面的就是锁的引用, 任何一个Java对象都可以成为。 你可以实例化一个Object对象,将它作为锁。如果直接使用this,代表使用当前对象作为锁。

     

     三、synchronized 关键字的用法

     1、修饰实例方法:用到的锁,默认为this当前方法调用对象。

    • 使用当前对象this充当锁,完成对当前方法的锁定,只有获取this锁的线程才能访问当前方法
    • 并发过程中,同一时刻,可以有N个线程请求执行方法,但只有一个线程可以持有this锁,才能执行;
    • 不同线程,持有的对象,必须相同     

     

    2、修饰静态方法:用到的锁,默认为Class对象。

    • 使用当前对象的Class对象充当锁,完成对方法的锁定,只有获取Class锁的线程才能访问当前方法;
    • 不同线程,持有的对象,可以不同,但必须是相同Class类型;

     

    3、修饰代码块:用到的锁,默认为某个指定Java对象。

    1. synchronized(自定义对象) {
    2. //临界区
    3. }

     四、Synchronized关键字的补充

    • 当一个线程访问对象的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该对象中的非synchronized(this)同步代码块;

     在没有加锁的情况下, 所有的线程都可以自由地访问对象中的代码, 而synchronized关键字只是限制了线程对于已经加锁的同步代码块的访问,并不会对其他代码做限制。所以,同步代码块应该越短小越好。

    •  父类中synchronized修饰的方法,如果子类没有重写,则该方法仍然是线程安全性;如果子类重写,并且没有使用synchronized修饰,则该方法不是线程安全的;
    • 在定义接口方法时,不能使用synchronized关键字;
    • 构造方法不能使用synchronized关键字,但可以使用synchronized代码块来进行同步;
    • 离开synchronized代码块后,该线程所持有的锁,会自动释放;
  • 相关阅读:
    软件测试职业生涯需要编写的全套文档模板,收藏这一篇就够了 ~
    什么时候用@MapperScan 注解?
    一文详解Cpp工程调用python文件
    【JavaEE重点知识归纳】第6节:数组
    MDC And NDC
    WPF的由来
    68 - 令人迷惑的写法
    MySQL数据库备份的三种方式
    Mybatis工作流程及原理详解
    河南财经政法大学计算机考研资料汇总
  • 原文地址:https://blog.csdn.net/qq_49194330/article/details/126768610