java 中 synchronized (class) 是什么意思

本文解释了Java中使用synchronized(XXX.class)的意义,即锁定特定的类实例而非类本身,帮助理解不同类型的锁机制。

java 中 synchronized (class) 是什么意思?

20
 private static void test3() {
  synchronized (XXX.class) {
   System.out.println("b");
  }
 }
 synchronized 锁的是一个类 锁this 锁object 都能理解   锁 class是什么意思?


=====================================================

任何的java元素都包含在类里边,对于任何的类,编译之后都对应了一个相应的.Class文件,同时Java也定义了Class类,它的实例对应各种Class文件,也就是说String.class是Class类的一个实例,Object.class也是Class的一个实例……。至于XX.class显然是一个Class的实例,而不是一个类。synchronized (XXX.class)和synchronized(this)这样的语句在语法上是同一类型的,只不过后者锁的是当前对象,而前者锁的是Class的一个实例xxx.class。
补充:
至于楼主说锁Object,synchronized似乎不能用于去锁一个类,只能锁住Object的实例。Java的同步机制在其根类Object中内置,因此Java在处理任何synchronized的时候只是把它向上转型成Object而已。无论括号中是this还是xxx.class,Jvm应该只认为它们是Object的一个实

Java 中,`synchronized` 是一种用于实现线程同步的关键字,它可以确保多个线程在访问共享资源时的可见性和有序性,同时保证原子性。其底层原理主要涉及 Java 对象头、Monitor(监视器)、以及操作系统的互斥机制。 ### 1. **对象头与 Monitor** - 每个 Java 对象在 JVM 中都有一个对象头(Object Header),其中包含了一些用于管理对象元数据的信息。 - 当一个对象被用作 `synchronized` 锁时(如作为锁对象或类的静态方法锁),JVM 会在对象头中存储锁的状态信息。 - `synchronized` 的实现依赖于 Monitor(监视器),每个对象都有一个与之关联的 Monitor。Monitor 是一种同步工具,本质上是一个互斥锁(Mutex),它保证了同一时刻只有一个线程可以进入临界区。 ### 2. **锁的获取与释放** - 当一个线程尝试进入 `synchronized` 方法或代码块时,它会尝试获取对象的 Monitor 锁。 - 如果 Monitor 没有被其他线程持有,则当前线程获得锁,Monitor 的计数器加 1。 - 如果 Monitor 已经被其他线程持有,则当前线程会被阻塞,直到 Monitor 被释放。 - 持有锁的线程在退出同步代码块(正常退出或异常退出)时会释放 Monitor 锁,Monitor 的计数器减 1。 ### 3. **锁优化(JDK 1.6 及以后)** 为了提升性能,JVM 在 JDK 1.6 引入了锁优化机制,包括: - **偏向锁(Biased Locking)**:如果一个线程多次获取同一个锁,JVM 会将锁偏向该线程,减少不必要的 CAS 操作。 - **轻量级锁(Lightweight Locking)**:当多个线程交替访问同步资源时,使用 CAS 操作避免线程阻塞。 - **重量级锁(Heavyweight Locking)**:当多个线程发生竞争时,未获得锁的线程会被挂起,进入 Monitor 等待队列,此时性能开销较大。 ### 4. **编译器与字节码支持** - `synchronized` 在编译后会生成 `monitorenter` 和 `monitorexit` 字节码指令。 - `monitorenter` 表示尝试获取锁,`monitorexit` 表示释放锁。 - 即使代码中使用了异常处理,JVM 也会确保 `monitorexit` 总是会被执行,从而保证锁的释放。 --- ### 示例代码: ```java public class SynchronizedExample { private Object lock = new Object(); public void synchronizedMethod() { synchronized (lock) { // 同步代码块 System.out.println("线程 " + Thread.currentThread().getName() + " 正在执行同步代码"); } } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值