当前位置: 首页 > article >正文

sychronized锁

sychronized 关键字能成为锁的原因,是因为它提供了**内置锁(Intrinsic Lock)**机制,用于线程同步,确保同一时刻只有一个线程能够访问被标记为 synchronized 的代码块或方法。

原理解析

  1. 内置锁的概念
    每个 Java 对象都关联着一个内置锁,称为 监视器锁(Monitor Lock)。
    • 当一个线程进入 synchronized 方法或代码块时,它必须获得该对象的内置锁。
    • 其他线程在尝试访问同一对象的其他 synchronized 方法或代码块时,必须等待,直到当前线程释放锁。
  2. synchronized 的两种用法
    • 实例方法锁
public synchronized void method() {
    // 线程安全的操作
}

锁住的是当前实例对象 (this),即每个对象有独立的锁。

• 静态方法锁

public static synchronized void staticMethod() {
    // 线程安全的操作
}

锁住的是当前类的 Class 对象,适用于所有线程对类级别资源的同步。

• 代码块锁

public void method() {
    synchronized (this) {
        // 线程安全的操作
    }
}

只锁住代码块,不影响其他非同步代码。

  1. 底层实现
    • synchronized 是 JVM 内置的同步机制。
    • 编译器在字节码中生成了 monitorenter 和 monitorexit 指令,用于获取和释放内置锁。
    • 锁的特性:
    • 重入性:同一个线程可以多次获取它已持有的锁。
    • 可见性:确保变量的内存可见性,即锁释放后,修改的共享变量会对其他线程可见。
  2. 为什么可以成为锁
    • synchronized 借助于 Java 对象的监视器锁机制,天然支持线程排他性和共享资源的安全访问。
    • 配合 JVM 的内存模型,保证了变量的可见性和操作的有序性。

举例说明

以下代码展示了 synchronized 如何控制线程同步:

class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public int getCount() {
        return count;
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Counter counter = new Counter();

        Runnable task = () -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        };

        Thread t1 = new Thread(task);
        Thread t2 = new Thread(task);

        t1.start();
        t2.start();
        t1.join();
        t2.join();

        System.out.println(counter.getCount()); // 输出 2000
    }
}

在这个例子中,synchronized 确保了多个线程对 increment 方法的访问是互斥的,避免了数据竞争。


http://www.kler.cn/a/396159.html

相关文章:

  • Scala的Array
  • 基于汇编语言的贪吃蛇程序
  • 基于 PyTorch 从零手搓一个GPT Transformer 对话大模型
  • apk反编译修改教程系列-----apk应用反编译中AndroidManifest.xml详细代码释义解析 包含各种权限 代码含义【二】
  • 鸿蒙 管理应用拥有的状态有Localstorage、Appstorage、PersistentStorage、Environment、用户首选项、持久化方案。
  • 关系型数据库和非关系型数据库详解
  • QT_CONFIG宏使用
  • 【扩散——BFS】
  • 用Python将Word文档转换为Markdown格式
  • 【PyTorch】PyTorch Geometric(PyG)安装指南:如何高效配置图神经网络环境
  • excel-VLOOKUP函数使用/XVLOOKUP使用
  • AUTOSAR_EXP_ARAComAPI的7章笔记(4)
  • 单片机智能家居火灾环境安全检测
  • 蓝桥杯每日真题 - 第14天
  • ubuntu20.04默认的python3.8升级到python3.10
  • 内网、公网(外网)划分
  • 从AI新手到高手:学习提示词,让智能助手更懂你
  • stm32F4 低功耗模式实例解析
  • Ubuntu 的 ROS 2 操作系统 turtlebot3 gazebo仿真
  • 【计算机毕设】无查重 基于python豆瓣电影评论舆情数据可视化系统(完整系统源码+数据库+开发笔记+详细部署教程)✅
  • 天润融通活动预告丨走进上汽集团,探秘数智标杆
  • 时钟之CSS+JS版
  • 09C++结构体
  • C++各类函数评点+详解
  • MySQL数据库最大连接数查询及修改
  • R语言贝叶斯分析:INLA 、MCMC混合模型、生存分析肿瘤临床试验、间歇泉喷发时间数据应用|附数据代码...