Ograniczenie dostępu do zmiennej przez maksymalnie 1 wątek jednocześnie

0

Witam,
Często zachodzi potrzeba, aby dostęp do zmiennej będącej składowej klasy mógł być dostępny przez maksymalnie 1 wątek jednocześnie. W tym celu w języku C zamykałem tą zmienną w muteksie.

Rozumiem, że takim odpowiednikiem muteksu dla całej metody jest słowo kluczowe synchronized opisane tutaj:
http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html
Jak widać to działa na metodach, a nie zmiennych / obiektach.

Zasadnicze pytanie: czy słowo kluczowe synchronized stosuje się do zmiennych / kontenerow dostępnych w klasie np.
protected int zmienna_do_ktorej_powinien_pisac_jeden_obiekt_jednoczesnie?

Czy jest jakaś różnica między metodą synchronized, a stosowaniem muteksów z PThreads?

Pozdrawiam,

0

ad.1.Da się zrobić to o czym mówisz:

void metoda(){
  synchronized(zmienna_do_ktorej_powinien_pisac_jeden_wątek){
    // operacje w sekcji krytycznej
  }
}

Poza tym jest znacznie wiecej różnych mechanizmów w javie związanych z synchronizacją. Są o tym całe książki i nie zamierzam się tutaj nad wszystkimi rozwodzić ;] Najpopularniejsze to:

  • metody synchronizowane
  • sekcje synchronizowane
  • locki z java.concurrent
  • zmienne volatile

ad.2. Jest różnica. Metoda synchronized to taka metoda że w danej chwili tylko jeden wątek może wykonywać którąś z metod synchronizowanych. Mutexy pozwalają ci tworzyć sekcje krytyczne o mniejszej granulacji niż metoda.

0

Dzięki. A tak przy okazji, czy to słowo kluczowe synchronized to przypadkiem nie wzorzec projektowy 'monitor'?

0

Słowa kluczowe "synchronized" korzystają z monitorów, które w Javie są integralną częścią każdego obiektu. Nie wiem czy o to ci chodziło ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1