synchronized (Java)

目录

[一、synchronized 的特性](#一、synchronized 的特性)

[二、synchronized 的使用](#二、synchronized 的使用)

1、修饰方法

2、修饰代码块

[三、synchronized 锁机制](#三、synchronized 锁机制)


一、synchronized 的特性

  1. 原子性:被 synchronized 修饰的代码块或方法,在同一时刻只能有一个线程执行,保证了原子性,避免多线程下数据的不一致
  2. 可见性:当线程释放锁时,会将工作内存中的变量刷新到主内存,当线程获取到锁时,会从主内存中读取最新的变量值,保证了多线程变量的可见性
  3. 开始是乐观锁,如果锁冲突频繁,就转换为悲观锁
  4. 开始是轻量级锁实现,如果锁被持有的时间较长,就转换为重量级锁
  5. 实现轻量级锁的时候大概会用到的自旋锁策略
  6. 可重入锁:同一线程可以多次获取同一把锁,不会因为自己已经持有锁而造成死锁
  7. 是一种不公平锁
  8. 不是读写锁

二、synchronized 的使用

1、修饰方法

  • 修饰实例方法:锁是当前实例对象
java 复制代码
    public synchronized void method(){
        //代码块
    }
  • 修饰静态方法:锁是当前类的 Class 对象
java 复制代码
    public static synchronized void staticMethod(){
        //代码块
    }

2、修饰代码块

  • 指定对象作为锁
java 复制代码
    Object locker=new Object();
    public void method(){
        synchronized (locker) {
            //代码块
        }
    }
  • 使用当前实例作为锁
java 复制代码
    public void method(){
        synchronized (this) {
            //代码块
        }
    }
  • 使用类的 Class 对象作为锁
java 复制代码
   public void method(){
        synchronized (ClassName.class) {
            //代码块
        }
    }

三、synchronized 锁机制

synchronized****的锁机制会根据竞争情况进行锁升级,从无锁状态逐步升级为偏向锁、轻量级锁(自旋锁是其中一种表现),最后到重量级锁,以平衡性能和线程安全

  1. 无锁:对象刚创建时,还没有线程竞争它的锁,无任何开销,但不保证线程安全
  2. 偏向锁:偏向锁不是真的加锁,而是在锁的对象中记录一个标记(记录该锁所属的线程),如果没有其它线程参与竞争锁,那么就不会真正执行加锁操作,从而降低程序开销,一旦真的涉及到其它线程竞争,再取消偏向锁状态,进入轻量级锁状态
  3. 轻量级锁(自旋锁为其表现形式):当有线程竞争,但等待时间很短(如锁被其它线程短暂持有),竞争线程不会立即阻塞,而是通过 " 自旋 " (循环判断锁是否释放)来等待,避免线程切换的开销,但自旋太久会浪费CPU
  4. 重量级锁:当线程竞争激烈或持有锁时间长时,自旋已无意义,会升级为重量级锁,竞争线程会阻塞并放入等待队列,由操作系统调度唤醒,开销大,但可以保证线程安全

相关推荐
考虑考虑4 小时前
JDK26中的Map.ofLazy
java·后端·java ee
鶴哥只手遮天8 小时前
Spring AI 2.0.1 深度解析-第 14 章 MCP 服务端(上):注解式实现与工具来源
java·人工智能·开源
鶴哥只手遮天8 小时前
Spring AI 2.0.1 深度解析-第 15 章 MCP 服务端(下):三种协议形态、Streamable 传输与状态管理
java·人工智能·开源
鶴哥只手遮天8 小时前
Spring AI 2.0.1 深度解析-第 16 章 向量存储(上):`VectorStore` 接口体系、`BatchingStrategy`
java·人工智能·开源
鶴哥只手遮天8 小时前
Spring AI 2.0.1 深度解析-第 12 章 工具循环的流式形态、Usage 累加与扩展体系
java·人工智能·开源
鶴哥只手遮天8 小时前
Spring AI 2.0.1 深度解析-第 23 章 模型供应商实现:从 `OpenAiSetup` 到 Bedrock
java·人工智能·开源
鶴哥只手遮天8 小时前
Spring AI 2.0.1 深度解析-第 06 章 内置 Advisor 全景:13 个实现逐个剖到源码级
java·人工智能·开源
鶴哥只手遮天8 小时前
Spring AI 2.0.1 深度解析-第 03 章 消息体系与 Prompt:不可变模型、`ChatOptions` 与模板渲染
java·人工智能·开源
鶴哥只手遮天8 小时前
Spring AI 2.0.1 深度解析-第 24 章 生产实践与 2.x 迁移:陷阱清单、AOT 与调优
java·人工智能·开源
鶴哥只手遮天8 小时前
Spring AI 2.0.1 深度解析-第 10 章 工具调用(中):执行链路、结果转换与工具限制
java·人工智能·开源