如何保证一个类的非静态方法(实例方法)在多个线程中是同步的?
答案
class InstanceMethodThreadSafe {
private static final Object mutex = new Object();
public void m1() {
synchronized (mutex) {
// do something ...
}
}
public void m2() {
synchronized (mutex) {
// do something ...
}
}
}
要点
因为题目没有说明对象的实例个数,因此如果单纯将synchronized 加在实例方法上,那么只能对this对象上锁,如果创建了该对象的多个实例,那么synchronized 锁住的是不同的对象,无法达到题目要求。
所以解决方法是创建一个静态全局mutex对象,让它作为多个线程的临界资源
或许有人说也可以 synchronized(InstanceMethodThreadSafe.class) 但这样的缺点是,静态方法和实例方法使用了同一个临界资源。当然题目没有问这么细,这么答也可以。