聊一聊synchronized

发布时间:2024年01月12日

聊一聊synchronized

在 Java 中,synchronized关键字可以用于实现线程同步,有以下几种常见的使用方式:

  1. 修饰代码块:将synchronized关键字放在代码块的前面,

    例如:

    synchronized (obj) {
        // 同步代码块 
    } 
    

    在这种方式下,会为给定的对象obj获取锁,在代码块执行期间,只有持有该锁的线程才能进入代码块执行。

  2. 修饰方法:将synchronized关键字放在方法声明的前面,

    例如:

     public synchronized void method() {
         // 同步方法 
     }
    

    在这种方式下,会为当前对象(即调用该方法的对象)获取锁,在方法执行期间,只有持有该锁的线程才能执行该方法。

  3. 静态同步方法:将synchronized关键字放在静态方法声明的前面,

    例如:

    public static synchronized void staticMethod() {
        // 静态同步方法 
    }
    

    在这种方式下,会为当前类获取锁,在静态方法执行期间,只有持有该锁的线程才能执行该静态方法。

    无论使用哪种方式,synchronized都会保证在同一时刻只有一个线程能够执行被同步的代码块或方法。这有助于避免竞态条件和保证线程安全。 需要注意的是,在使用synchronized时,要选择合适的锁对象,并避免过度使用同步,以免造成性能下降和死锁等问题。

使用synchronized关键字有几种加锁情况,分别锁的是什么 ?

在 Java 中,使用synchronized关键字可以有以下几种加锁情况:

  1. 实例方法加锁:当在一个实例方法上使用synchronized关键字时,会对当前对象实例加锁。也就是说,只有持有该对象实例锁的线程才能执行该方法.
  2. 静态方法加锁:当在一个静态方法上使用synchronized关键字时,会对当前类加锁。这意味着只有持有该类锁的线程才能执行该静态方法。
  3. 代码块加锁:当使用synchronized关键字修饰一个代码块时,可以指定一个对象作为锁。在代码块执行期间,只有持有该对象锁的线程才能执行代码块中的代码。
  4. 无论是实例方法、静态方法还是代码块,加锁的目的都是为了保证在同一时刻只有一个线程能够执行被保护的代码或方法。通过这种方式,可以避免竞态条件和数据不一致的问题,确保线程安全性。 需要注意的是,选择合适的锁对象是很重要的。一般情况下,应尽量选择最小粒度的锁,以提高并发性能。同时,避免在不需要线程安全的情况下过度使用synchronized,以免影响程序的性能。
聊一聊synchronized锁升级

在 Java 中,synchronized 锁可以进行升级,以提高锁的效率。具体来说,当多个线程竞争同一个锁时,锁的状态会按照以下顺序进行升级:

  • 无锁:没有其他线程竞争锁。
  • 偏向锁:一段同步代码一直被同一个线程访问,该线程会自动进入偏向锁状态。再次访问同步代码时,不需要做任何的检查,直接执行,降低了获取锁的代价。
  • 轻量级锁:当锁竞争逐渐激烈时,会升级为轻量级锁。
  • 重量级锁:当锁竞争非常激烈时,会升级为重量级锁。
  • 锁的升级是不可逆的,只能进行锁升级,而无法进行锁降级。通过这种方式,可以根据锁的竞争情况动态调整锁的级别,从而提高程序的并发性能。
文章来源:https://blog.csdn.net/qq_37924905/article/details/135562729
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。