2013-01-02 16 views
9

Mam statyczną metodę z następującym podpisem:jednoczesnego dostępu do metod statycznych

public static List<ResultObjects> processRequest(RequestObject req){ 
    // process the request object and return the results. 
} 

Co się dzieje, gdy istnieje wiele połączeń do powyższego sposobu jednocześnie? Czy wnioski będą rozpatrywane jednocześnie lub jedno po drugim?

+0

ta została udzielona odpowiedź [inna sprawa] (http://stackoverflow.com/questions/6593450/concurrent-access-to-a-utility-static- metoda). – igracia

Odpowiedz

12

Jeśli chcesz uniknąć równoczesnego wykonywania, musisz jawnie zsynchronizować. Fakt, że metoda jest statyczna, nie ma z tym nic wspólnego. Jeśli zadeklarujesz samą metodę jako synchronized, wówczas synchronizacja będzie dotyczyć obiektu klasy. W przeciwnym razie będziesz musiał zsynchronizować jakiś statyczny obiekt (ponieważ this nie istnieje dla metod statycznych).

+0

+1 Nie jest jasne, czy musisz "unikać jednoczesnego wykonywania", ale jeśli tak, potrzebujesz jakiegoś rodzaju blokady. –

+0

Nie jestem downvoter, ale chciałbym zauważyć, że pytanie na ten temat nie jest o tym, jak on może zapobiec realizacji współbieżności. Po prostu pyta: co będzie ... jeśli ... – Andremoniy

+0

@ PeterLawrey- Ah. Teraz widzę, jak moje pierwsze zdanie można było interpretować jako stwierdzenie, że należy unikać równoległej realizacji. Miałem na myśli to jako warunkowe. Będę powtórnie sformułować. –

-1

wszystkie wywołania metod z oddzielnych wątków w java są domyślnie współbieżne.

+0

Downvoters lubisz komentować? – jtahlborn

18

dokładnie Odpowiadając na Twoje pytanie:

  1. Metoda będą wykonywane równolegle (kilka razy w tym samym czasie, jeśli masz kilka wątków).
  2. Żądania będą obsługiwane jednocześnie.

Musisz dodać modyfikator synchronized, jeśli pracujesz z obiektami, które wymagają współbieżnego dostępu.

+1

Musisz dodać "zsynchronizowane", gdy chcesz zapobiec równoczesnej realizacji. To, czy pola lub metody są "statyczne", nie ma znaczenia dla tego rozważania. –

+0

@ TedHopp, dzięki, wiem. Mówiąc o "zsynchronizowaniu", miałem na myśli, że problemy ze współbieżnością mogą pojawić się tylko w przypadku, gdy metoda będzie miała umowę z pewnymi statycznymi (w tym konkretnym przypadku) polami. – Andremoniy

+0

@ TedHopp, BTW, jestem * nie * że downvoter twojego postu :) – Andremoniy

6

Wszystkie połączenia metody będą realizowane równocześnie ... ale:

Możesz mieć problem współbieżności (i będąc w sytuacji braku bezpieczny wątku) jak tylko kod metodę statyczną modyfikować zmienne statyczne . W takim przypadku możesz zadeklarować swoją metodę jako synchronized Jeśli twoja metoda używa tylko zmiennych lokalnych, nie będziesz mieć problemów z współbieżnością.

+0

Myślę, że ta linia jest tym, co wypycha więcej osób "Jeśli twoja metoda wykorzystuje tylko zmienne lokalne, nie będziesz mieć problemów z współbieżnością. ". Myślę, że powinno to uzyskać więcej upvotes! –

1

Można to sprawdzić samemu:

public class ConcurrentStatic { 

    public static void main(String[] args) { 
     for (String name: new String[] {"Foo", "Bar", "Baz"}) { 
      new Thread(getRunnable(name)).start(); 
     } 
    } 

    public static Runnable getRunnable(final String name) { 
     return new Runnable() { 
      public void run() { 
       longTask(name); 
      } 
     }; 
    } 

    public static void longTask(String label) { 
     System.out.println(label + ": start"); 
     try { 
      Thread.sleep(10000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.println(label + ": end"); 
    } 

} 
Powiązane problemy