在 Java 中,synchronized 是用于实现线程同步的关键字,它可以在任意对象上加锁。当一个线程访问 synchronized 方法或 synchronized 代码块时,它就会获得该对象的锁,其他线程必须等待该线程释放锁后才能访问该对象。
synchronized 对象锁可以分为两种:
1. 对象锁(非静态方法锁)
当一个线程调用一个对象的 synchronized 方法时,它就会获得该对象的锁,其他线程必须等待该线程释放锁后才能访问该对象。如果一个对象有多个 synchronized 方法,那么当一个线程获得该对象的锁后,其他线程也不能调用该对象的其他 synchronized 方法。
例如:
public synchronized void method1(){
// ...
}
public synchronized void method2(){
// ...
}
在上面的例子中,当一个线程调用 method1() 方法时,它就会获得该对象的锁,其他线程不能调用 method1() 或 method2() 方法。同理,当一个线程调用 method2() 方法时,其他线程也不能调用 method1() 或 method2() 方法。
2. 类锁(静态方法锁)
当一个线程调用一个对象的 synchronized 静态方法时,它就会获得该对象所属的类的锁,其他线程必须等待该线程释放锁后才能访问该对象所属的类。
例如:
public static synchronized void method1(){
// ...
}
public static synchronized void method2(){
// ...
}
在上面的例子中,当一个线程调用 method1() 方法时,它就会获得该对象所属的类的锁,其他线程不能调用 method1() 或 method2() 方法。同理,当一个线程调用 method2() 方法时,其他线程也不能调用 method1() 或 method2() 方法。
需要注意的是,synchronized 对象锁只能控制同一个对象的同步访问,对于不同对象之间的访问,需要使用其他的同步机制。