Quote Originariamente inviata da hopeway Visualizza il messaggio
in pratica vorrei passare ai miei thread il nome (e lo faccio tramite .currentThread().getThread() )
Il nome lo devi passare all'oggetto Thread ... non al tuo Runnable. Il name del java.lang.Thread, quello è il "vero" nome del thread!

Mentre:

String threadName = Thread.currentThread().getName();

non ha senso concettualmente, perché questa inizializzazione avviene quando il tuo products viene istanziato. E i due oggetti products li crei nel contesto del "main" thread! (quindi avrebbero lo stesso nome del main thread)

Quote Originariamente inviata da hopeway Visualizza il messaggio
ma da errore in compilazione
Un errore in compilazione lo hai di sicuro, perché nel costruttore di products fai un:

super(threadName);

Ma products estende (implicitamente) Object, che NON ha certo un costruttore che riceve un String !

Quote Originariamente inviata da hopeway Visualizza il messaggio
Inoltre volevo sapere la differenza tra un metodo synchronized e no e se è necessario usarlo all'interno dei metodi di varGlobale.
Acquisire un lock permette di avere atomicità, mutua-esclusione e garanzia della "visibilità" delle modifiche. Soltanto UN thread per volta può acquisire il lock.

Un metodo "di istanza" (non static) synchronized acquisisce il lock sull'oggetto su cui il metodo è invocato.
Un metodo "di classe" (static) synchronized acquisisce il lock sull'oggetto java.lang.Class associato a quella classe.


E siccome lo stesso oggetto varGlobale è usato concorrentemente da due thread differenti, allora DEVI usare synchronized sui metodi di varGlobale.
Perché acc+=i; di per sé NON è "atomico" quindi senza synchronized cosa succede .... boh, cose brutte ....
E in ogni caso senza synchronized non avresti garanzia sulla "visibilità" delle modifiche da parte di altri thread.