佛山行业网站建设h5网站用什么软件做
2026/4/17 12:12:33 网站建设 项目流程
佛山行业网站建设,h5网站用什么软件做,企业网站管理系统演示平台,北京网站备案拍照地址鼓楼一、synchronized 的基本概念1.1 作用synchronized 是 Java 中的关键字#xff0c;用于实现线程同步#xff0c;确保#xff1a;原子性#xff1a;确保多个操作要么全部执行#xff0c;要么全部不执行可见性#xff1a;确保一个线程修改共享变量后#xff0c;其他线程能…一、synchronized 的基本概念1.1 作用synchronized是 Java 中的关键字用于实现线程同步确保原子性确保多个操作要么全部执行要么全部不执行可见性确保一个线程修改共享变量后其他线程能立即看到有序性防止指令重排序1.2 使用方式// 1. 同步实例方法 public synchronized void instanceMethod() { // 锁是当前实例对象 } // 2. 同步静态方法 public static synchronized void staticMethod() { // 锁是当前类的Class对象 } // 3. 同步代码块 public void method() { synchronized (lockObject) { // 锁是指定的对象 } }二、底层实现原理2.1 Java 对象头每个 Java 对象在内存中都包含对象头其中与锁相关的信息存储在 Mark Word 中32位 JVM 对象头布局|--------------------------------------------------------------| | Mark Word (32 bits) | |--------------------------------------------------------------| | 锁状态 | 25 bits | 4 bits | 1 bit | 2 bits | |-----------------|-------------------|--------|-------|--------| | 无锁 | hashCode | 分代年龄 | 0 | 01 | | 偏向锁 | ThreadID | Epoch | 分代年龄 | 1 | 01 | | 轻量级锁 | 指向栈中锁记录的指针 | | 00 | | 重量级锁 | 指向重量级锁Monitor的指针 | | 10 | | GC标记 | 空 | | | 11 |64位 JVM 对象头布局类似只是位数不同。2.2 Monitor 机制synchronized是通过 Monitor监视器锁实现的// 字节码层面 public void synchronizedMethod() { synchronized (this) { // 业务代码 } } // 对应的字节码 0: aload_0 1: dup 2: astore_1 3: monitorenter // 进入同步块 4: aload_1 5: monitorexit // 正常退出 6: goto 14 9: astore_2 10: aload_1 11: monitorexit // 异常退出 12: aload_2 13: athrow 14: return三、锁升级过程锁膨胀Java 6 之后synchronized 实现了锁升级机制以提高性能3.1 无锁状态初始状态对象未被任何线程锁定。3.2 偏向锁Biased Locking适用场景只有一个线程访问同步块流程线程第一次访问同步块时检查 Mark Word 中的锁标志位如果是 01无锁/偏向锁通过 CAS 将线程 ID 写入 Mark Word成功则获取偏向锁锁标志位不变仍是 01后续同一线程进入时只需检查线程 ID 是否匹配优点只有一个线程时性能接近无锁3.3 轻量级锁Lightweight Locking触发条件有多个线程竞争但竞争不激烈流程当有第二个线程尝试获取锁时偏向锁升级为轻量级锁在当前线程的栈帧中创建锁记录Lock Record将对象头 Mark Word 复制到锁记录中Displaced Mark Word尝试通过 CAS 将对象头替换为指向锁记录的指针成功则获得锁失败则自旋重试自旋策略自旋次数有限默认 10 次可通过参数调整自适应自旋根据上次自旋成功与否动态调整3.4 重量级锁Heavyweight Locking触发条件竞争激烈或自旋失败流程轻量级锁升级为重量级锁对象头指向操作系统层面的互斥量Mutex未获取锁的线程进入等待队列被操作系统挂起需要用户态到内核态的切换开销大四、锁的优缺点对比锁类型优点缺点适用场景偏向锁加锁解锁无额外消耗有竞争时会额外消耗单线程访问轻量级锁竞争线程不阻塞自旋自旋消耗CPU追求响应时间同步块执行快重量级锁竞争线程不消耗CPU线程阻塞响应慢追求吞吐量同步块执行时间长五、锁优化技术5.1 锁消除Lock Eliminationpublic String concatString(String s1, String s2, String s3) { // StringBuffer 是线程安全的但这里 sb 是局部变量 // JVM 检测到 sb 不可能逃逸出方法会消除锁 StringBuffer sb new StringBuffer(); sb.append(s1); sb.append(s2); sb.append(s3); return sb.toString(); }5.2 锁粗化Lock Coarsening// 多次加锁解锁合并为一次 for (int i 0; i 1000; i) { synchronized (this) { // JVM 可能会合并这1000次锁操作 // do something } } // 可能优化为 synchronized (this) { for (int i 0; i 1000; i) { // do something } }5.3 自适应自旋Adaptive SpinningJVM 根据之前的自旋成功率动态调整自旋次数。六、与 ReentrantLock 对比特性synchronizedReentrantLock实现方式JVM 内置Java API 实现锁获取自动获取释放手动 lock/unlock可中断不支持支持公平锁非公平可选公平/非公平条件变量只能有一个可创建多个 Condition性能Java 6 后优化两者接近功能更丰富七、使用建议优先使用 synchronized在 Java 6 中性能已大幅优化减少锁粒度使用细粒度锁减少竞争缩短持有时间同步块内代码尽可能少避免嵌套锁防止死锁考虑读写分离读多写少场景使用 ReadWriteLock八、常见问题Q1: synchronized 能否重入可以。同一线程可重复获取同一把锁。Q2: synchronized 是否公平默认非公平。但有一定偏向进入等待队列前会尝试直接获取锁。Q3: synchronized 能否中断不能。线程在等待锁时不能被中断。Q4: synchronized 锁的是什么实例方法锁的是当前对象实例this静态方法锁的是当前类的 Class 对象同步块锁的是括号里的对象总结synchronized是 Java 并发编程的基石通过对象头、Monitor 机制和锁升级策略在保证线程安全的同时兼顾了性能。理解其底层原理有助于编写更高效、更安全的并发程序。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询