Frecuentemente, los threads necesitan compartir datos. Por ejemplo, supongamos que existe un thread que escribe datos en un fichero mientras, al mismo tiempo, otro thread está leyendo el mismo fichero. Cuando los threads comparten información necesitan sicronizarse para obtener los resultados deseados.
Si se escribe un programa en el que varios threads concurrentes deben competir por los recursos, se debe tomar las precauciones necesarias para asegurarse la justicia. Un sistema es justo cuando cada thread obtiene suficiente acceso a los recursos limitados como para tener un progreso razonable. Un sistema justo previene el hambre y el punto muerto. El hambre ocurre cuando uno o más threads de un programa están bloqueados por ganar el acceso a un recurso y así no pueden progresar. El punto muerto es la última forma de hambre; ocurre cuando dos o más threads están esperando una condición que no puede ser satisfecha. El punto muerto ocurre muy frecuentemente cuando dos (o más) threads están esperando a que el otro u otros haga algo.
Los programas pueden modificar variables miembros fuera de la protección de un método o un bloque sincronizados y puede declarar que la variable miembro es volatile.Si una variable miembro es declarada como volatile, el sistema de ejecución Java utiliza esta información para asegurarse que la variable sea cargada desde la mémoria antes de cada uso, y almacenada en la memoria después de utilizarla. Esto asegura que el valor de la variable es consistente y coherente a lo largo del programa.