synchronized
关键字是Java中用于实现线程同步的一种内置机制。当使用synchronized
修饰方法或代码块时,默认的锁对象取决于其应用场景:
- 同步方法:如果
synchronized
修饰的是非静态方法,那么默认的锁对象就是当前实例对象(this)。这意味着在同一时刻,最多只有一个线程能够访问该实例的任何一个同步方法。不同实例之间的同步方法可以同时被不同线程访问,因为它们使用各自的实例作为锁。
public class MyClass {
public synchronized void synchronizedMethod() {
// 同步代码块
}
}
在上述代码中,MyClass
的实例myObject
的synchronizedMethod()
方法的默认锁对象就是myObject
本身。
- 同步静态方法:如果
synchronized
修饰的是静态方法,那么默认的锁对象就是当前类的Class对象。这意味着在同一时刻,最多只有一个线程能够访问该类的任何一个同步静态方法,无论创建了多少个该类的实例。
public class MyClass {
public synchronized static void synchronizedStaticMethod() {
// 同步代码块
}
}
在上述代码中,MyClass
的同步静态方法synchronizedStaticMethod()
的默认锁对象就是MyClass.class
。
- 同步代码块:当
synchronized
用于修饰代码块时,您可以显式指定一个对象作为锁:
public class MyClass {
private final Object lock = new Object();
public void someMethod() {
synchronized (lock) {
// 同步代码块
}
}
}
在上述代码中,someMethod()
中的同步代码块使用了显式定义的lock
对象作为锁。
总结来说,synchronized
关键字默认的锁对象取决于其修饰的方法类型:
- 对于非静态方法,锁对象是当前实例(
this
)。 - 对于静态方法,锁对象是当前类的Class对象。
- 对于同步代码块,锁对象由开发者明确指定。