Java synchronizacja wątków, jak to uruchomić?

0

Witajcie,

    Mam dwie klasy: MyDiscoveryListener i RaspberryPi implementujące klase Runnable kożystające z wspólnego zasobu konkretnie ArrayListy. MyDiscoveryListener musi dzialac cyklicznie dlatego uruchamiam to z wykożystainem wątków. I teraz dochodze do problemu jako że kożystają z wspólnego zasoby czyli ArrayListy chce je zsynchronizować. Niestety nie wiem jak to zapisać, troche się już naczytałem ale jakos nie widze rozwiązania. Mam stworzyc w każdej z tych klas specjalną metode synchroniczną?
static  ArrayList lista = new ArrayList();


    public static void main(String[] args) {
       
        MyDiscoveryListener m = new MyDiscoveryListener(lista);
        Thread t = new Thread(m);
        t.start();       
        
        RaspberryPi r = new RaspberryPi(lista);
        Thread t2 = new Thread(r);
        t2.start(); 
    }   
0

Prostym rozwiazaniem byłoby użycie listy synchronizowanej, trochę bardziej skomplikowanym obudowanie ArrayListy w obiekt synchronizujący dostęp. Z tym że takie rozwiązania to raczej tylko na uczelnię, na produkcję bym tego nie wpuścił.

0

Najprościej

  1. zamiast ArrayList użyj CopyOnWriteArrayList.
  2. Albo każde odwołanie do list zrób wewnątrz:
synchronized( myList) {
\\tu się bawie listą 
}
0

Polecama poczytać Java Concurrency in Practice

0

Właśnie do tego dąże:

sychronized (lsita){
lista.add(...);
}

I tak przed każdą metodą która będzie miała dostęp do zasobu w obu klasach implementujących Runnable?

0

Tak - ale pamiętaj, że np. jeśli lista jest długa i robisz w pętli dużo add, czy jakieś iteracje to blokujesz długi watek.
(ale lepiej blokować niż rozwalić).
Przy okazji CopyOnWriteArrayList - ma trochę mniej problemów, bo możesz z dwóch wątków jednocześnie zmieniać i iterować.

0

A co do książek to polecam Venkata "Programming Concurrency on the JVM". Jest dużo nowsza do Goetza i nieco bardziej wysokopoziomowa. I są np. opisane praktycznie takie cuda jak STM.

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