En lenguaje sencillo,
estática : las staticvariables están asociadas con la clase , en lugar de con cualquier objeto . Cada instancia de la clase comparte una variable de clase, que está en una ubicación fija en la memoria
volátil : esta palabra clave es aplicable tanto a las variables de clase como de instancia .
El uso de variables volátiles reduce el riesgo de errores de consistencia de la memoria, porque cualquier escritura en una variable volátil establece una relación de suceso anterior con lecturas posteriores de esa misma variable. Esto significa que los cambios en una variable volátil siempre son visibles para otros hilos
Echar un vistazo a este artículo por Javin Paul entender las variables volátiles de una mejor manera.

En ausencia de volatilepalabra clave, el valor de la variable en la pila de cada subproceso puede ser diferente. Al hacer la variable como volatile, todos los hilos obtendrán el mismo valor en su memoria de trabajo y se evitarán los errores de consistencia de la memoria.
Aquí el término variablepuede ser staticvariable (clase) o variable instance(objeto).
Con respecto a su consulta:
De todos modos, un valor de variable estática también será un valor para todos los hilos, entonces ¿por qué deberíamos elegir volátil?
Si necesito instancevariable en mi aplicación, no puedo usar staticvariable. Incluso en caso de staticvariable, no se garantiza la coherencia debido a la memoria caché de subprocesos como se muestra en el diagrama.
El uso de volatilevariables reduce el riesgo de errores de consistencia de la memoria, porque cualquier escritura en una variable volátil establece una relación de suceder antes con lecturas posteriores de esa misma variable. Esto significa que los cambios en una variable volátil siempre son visibles para otros subprocesos.
Además, también significa que cuando un hilo lee una variable volátil, ve no solo el último cambio en el volátil, sino también los efectos secundarios del código que provocó el cambio => los errores de consistencia de memoria aún son posibles con variables volátiles . Para evitar los efectos secundarios, debe usar variables sincronizadas. Pero hay una mejor solución en Java.
El uso del acceso simple a la variable atómica es más eficiente que acceder a estas variables a través del código sincronizado
Algunas de las clases en el java.util.concurrentpaquete proporcionan métodos atómicos que no dependen de la sincronización.
Consulte este artículo de control de concurrencia de alto nivel para obtener más detalles.
Especialmente eche un vistazo a las variables atómicas .
Preguntas SE relacionadas:
Volátil Vs Atómico
Boolean volátil vs AtomicBoolean
Diferencia entre volátil y sincronizado en Java