HalJordan ha scritto:
SafeSet deve essere Thread Safe, l'ho fatto in questa maniera
Sì, corretto. Avendo messo
synchronized sui 3 metodi "di istanza", gli oggetti SafeSet sono di fatto thread-safe.
HalJordan ha scritto:
ma sarebbe stato possibile usare delle collezioni sincronizzate evitando synchronized sui metodi?
Se intendi il fatto di mettere al posto dei due
new HashSet<>() un tipo di collezione "set" già di per sé thread-safe (e togliendo i synchronized), la risposta è: no.
Ma non perché una collezione thread-safe non sarebbe appropriata. Per un altro motivo: nel tuo remove fai delle operazioni composte "se x, fai y" e questo insieme di operazioni DEVE essere "atomico".
Avendo in trash/present delle collezioni thread-safe, le singole operazioni contains/remove/add sulle collezioni sarebbero atomiche. Ma il tuo insieme di operazioni nel TUO remove no.
HalJordan ha scritto:
perchè tipo non mi trovo certe volte con il primo add che restituisce "false".
Ciascuno dei due thread fa lo stesso identico a.add("ciao") (quindi il valore è lo stesso). Da un thread il add darà true (=inserito) e nell'altro thread darà false (=non inserito perché già presente).
Quale dei due thread riesce a fare PRIMA il add rispetto all'altro non è garantito, dipende dal caso ..