Как убедиться, что метод использует один экземпляр за раз - PullRequest
0 голосов
/ 29 февраля 2012

Это может быть простой вопрос, но все же это проблема для меня. У меня есть класс, у которого есть метод с именем task, и я хочу убедиться, что только один экземпляр этого класса может одновременно запускать этот метод. Я реализовал это так, и я делаю это правильно?

class A{

 public void task(){
   synchronized(A.this){ 
   //method stuff 
   }
 }

}

class B{
  public static void main(String a[]){
  new A().task();
  }
}

class C{
  public static void main(String a[]){
  new A().task();
  }
}

Если B запустил task и до его завершения C также пришел к задаче, я хочу C дождаться завершения B. пока это работает. Но я хочу знать, это правильный путь,

спасибо.

Ответы [ 2 ]

3 голосов
/ 29 февраля 2012

Не совсем.Имея это, вы гарантируете, что только один поток будет одновременно выполнять task() для данного экземпляра, но отдельные экземпляры могут по-прежнему запускать task() одновременно.То есть, если вы сделали это (в псевдокоде):

Thread t1 = new A().task();
Thread t2 = new A().task();
t1.start();
t2.start();

Тогда, поскольку каждый поток создает отдельный экземпляр A, каждый из них сможет запускать task() одновременновремя.

Вам необходимо выполнить синхронизацию в поле static (или A.class) или сделать task() статическим синхронизированным методом (в этом случае synchronized блокируется на основе Classобъект).

2 голосов
/ 29 февраля 2012

синхронизированный (A.this) будет полагаться на ваш экземпляр A. В вашем случае этот экземпляр может отличаться, т. Е. Поток, выполняющий B.main (), и другой поток, выполняющий C.main (), создадут другой экземпляр A. Следовательно, один из них сможет получить доступ к public void task(), даже если к нему уже обращается другой.

Если вы хотите убедиться, что один поток за раз может получить доступ к этому методу задачи, вы можете сделать это следующим образом:

    class A{ 
       private static final Object myLock = new Object ();

         public void task() { 
            synchronized(myLock) {  
               //method stuff  
            } 
         } 
    } 

Вы также можете взглянуть на Замки .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...