底层原理:在Java虚拟机中,每个对象都会有一个监视器锁,也称为内部锁或对象锁。这个锁是用来实现线程同步的机制。当多个线程同时访问同一个对象的synchronized代码块或方法时,只有一个线程能够获取到这个对象的监视器锁,其他线程需要等待。
具体来说,当一个线程执行到一个synchronized代码块时,它需要先获得synchronized代码块所属对象的监视器锁。如果这个锁没有被其他线程占用,那么当前线程就可以进入synchronized代码块执行相应的操作;如果这个锁已经被其他线程占用,那么当前线程就会被阻塞,直到获得锁为止。
对于实例方法(即非静态方法)上的synchronized关键字,它锁定的是当前实例对象的监视器锁;对于静态方法上的synchronized关键字,它锁定的是当前类的Class对象的监视器锁;对于代码块上的synchronized关键字,它锁定的是指定的对象的监视器锁。
下面是一些示例代码来演示synchronized关键字的使用:
public class Example {
public synchronized void synchronizedMethod() {
// synchronized代码块
// ...
}
}
public class Example {
public static synchronized void synchronizedMethod() {
// synchronized代码块
// ...
}
}
public class Example {
public void method() {
synchronized (this) {
// synchronized代码块
// ...
}
}
}
需要注意的是,synchronized关键字虽然可以确保线程同步,但它的性能可能较低,因为它会造成线程的阻塞和切换。在Java 5之后,另一种更高效的线程同步机制ReentrantLock也被引入,它提供了更灵活的锁定方式,并且可以显示地控制锁的获取和释放。在实际开发中,应根据具体的需求来选择合适的线程同步机制。