C'è anche atomics. Ciò consente di accedere al comando di base di confronto e scambio dell'hardware che è alla base di tutte le sincronizzazioni. Permette, ad esempio, di incrementare un numero in modo sicuro. Se il campo ++
è volatile, un altro thread che esegue la stessa istruzione potrebbe leggere il campo prima che il thread lo scriva, quindi riscriverlo a dopo il thread. Quindi un incremento si perde. Gli atomici leggono e scrivono "atomicamente" e quindi evitano il problema.
In realtà, volatili, dichiarazioni sincronizzato, e Atomics tendono a forzare tutti i dati thread per essere aggiornati dalla memoria principale e/o scritti in memoria principale a seconda dei casi, in modo da nessuno di loro sono veramente che il basso livello. (Sto semplificando qui. A differenza di C#, Java non ha un concetto di "memoria principale".)
penso che per la domanda 1, possiamo usare gli oggetti ReentrantLock e Condition, sono una specie di costrutto di livello inferiore. – Addict