问:如下代码片段,Child 类 中 method 还是并发同步的吗?
class Parent {
public synchronized void method() { }
}
class Child extends Parent {
public void method() { }
}
答:synchronized 关键修饰的方法被重写后默认不再是 synchronized 的;虽然可以使用 synchronized 来定义方法,但 synchronized 并不属于方法定义的一部分,所以如果在父类中的某个方法使用了 synchronized 关键字,而在子类中覆盖了这个方法,在子类中的这个方法默认情况下并不是同步的,必须显式地在子类的这个方法中加上 synchronized 关键字才可以。
问:synchronized 的 static 方法和非 static 方法有什么区别?
答:static 方法属于类方法,所以 static 获取到的锁是属于类的锁;而非 static 方法获取到的锁是属于当前对象的锁。
问:synchronized 的常用方式有哪几种?
答:修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁。修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁。修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。
本文参考自 synchronized 相关的几个实用问题解析