Java多线程中的对象锁及其工作原理

Java Q&A Hub 使用 GPT-4o-mini 回答

问题:

Java面试题之多线程 什么是对象锁?

回答:

在Java中,对象锁是用于实现线程同步的一种机制。它是Java中实现互斥访问共享资源的基础。对象锁与Java中的每个对象相关联,当一个线程获得了某个对象的锁后,其他线程就无法获得该对象的锁,从而保证了对共享资源的安全访问。

对象锁的工作原理

  1. 锁的获取:当一个线程想要执行一个被synchronized修饰的方法或代码块时,它必须先获得该对象的锁。如果该对象的锁已经被其他线程持有,那么当前线程就会被阻塞,直到锁被释放。

  2. 锁的释放:当持有锁的线程执行完synchronized方法或代码块后,锁会被自动释放。此时,其他被阻塞的线程可以尝试获取该锁。

  3. 锁的粒度:对象锁的粒度可以是方法级别(即整个方法被锁定)或代码块级别(即只有特定的代码块被锁定)。这取决于synchronized的使用方式。

示例代码

public class Counter {
    private int count = 0;

    // 使用对象锁的同步方法
    public synchronized void increment() {
        count++;
    }

    public int getCount() {
        return count;
    }
}

在上面的例子中,increment方法是一个同步方法,只有一个线程可以在同一时间内执行这个方法。其他线程在尝试调用increment时会被阻塞,直到持有锁的线程完成执行并释放锁。

注意事项

  • 死锁:如果多个线程相互等待对方持有的锁,就会导致死锁。需要小心设计锁的获取顺序以避免这种情况。
  • 性能:过度使用锁可能会导致性能下降,因为它会增加线程的上下文切换和阻塞的开销。
  • 可重入锁:Java中的对象锁是可重入的,即同一个线程可以多次获得同一个对象的锁而不会导致死锁。

总结

对象锁是Java多线程编程中非常重要的概念,它通过控制对共享资源的访问来保证线程安全。理解对象锁的工作原理和使用场景对于编写高效且安全的多线程程序至关重要。