To może ja dorzucę swoje 3 grosze.
Najpierw zdefiniujmy sobie ciałka tych klas, bo to dość istotne.
class GrupyUzytkownikow
{
private final List list;
public GrupyUzytkownikow()
{
this.list = new ArrayList();
}
}
list jest mutowalna, zainicjalizowana przez pole final oraz dostępna przez gettety i settery (każdy wątek może dowolnie modifikować zawartość)
zostaje nam
class Serwer
{
final GrupyUzytkownikow gu;
public Serwer(final GrupyUzytkownikow gu)
{
this.gu = gu;
}
}
Teraz zacznijmy od tego jakie są gwarancje z JMM.
Wszystkie obiekty które tworzysz (GrupyUzytkownikow oraz Serwer) mają pola z modyfikatorem final - to nam gwarantuje store barrier zaraz za stworzeniem obiektu (tu można się odwołać do art, który @Shalom przeczytał https://mechanical-sympathy.b[...]07/memory-barriersfences.html - w np Concurrency in Practice opisane jest to jako safty publication) - teraz, dzięki tej gwarancji możemy te obiekty podawać dalej, pomiędzy wątkami, problem jest taki że nie możemy ich modyfikować, bo te zmiany nie będą widoczne (mogą być, ale nie ma gwarancji JMM)
Co więcej, przez przypadek wprowadziłeś jeszcze jedną gwarancje, mianowicie happens-before( więcej tutaj -> https://docs.oracle.com/javase/tutorial/essential/concurrency/memconsist.html), pomiędzy wątkiem głównym (wykonującym metode main) oraz wątkami które tworzysz, to znaczy że wątki które stworzyłeś i odpaliłeś na nich .start() widzą wszystko co do tej porty zostało zmodyfikowane/stworzone przez główny wątek.
To znaczy że możesz bezpiecznie czytać z obiektów które stworzyłeś, w takim stanie jakie są teraz.
Ale po co nam obiekty których nie możemy bezpiecznie modyfikować ? Jedynym niebezpiecznym obiektem jest aktualnie pole List list z klasy GrupyUzytkownikow ponieważ obiekty które dodasz za jakiś czas mogą nie być widoczne przez wątki serwerów. Masz kilka opcji,
tak jak opisał @jarekr000000 użyć AtomicReference który zapewnia taką widzialność (ale tylko widzialność, nie ma sychronizacji)
możesz użyć volatile - to takie lekkie AtomicReference.
Ale żeby bez wyścigów wiele wątków mogło operować na takiej liście, potrzebne jest thread-safty,
Możesz opisać bardziej use-casy tych obiektów, pola jakie posiadają, można to napisać wydajniej :)
Niech safty-publication będzie z Tobą