如何保证一个类的非静态方法(实例方法)在多个线程中是同步的?

答案

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) 但这样的缺点是,静态方法和实例方法使用了同一个临界资源。当然题目没有问这么细,这么答也可以。


results matching ""

    No results matching ""