There are good practices that i recommend you to read them(this list will update as soon as new practices i find):

Thread Programming:

  1. In Summary volatile keyword in Java is not a replacement of synchronized block or method but in some situation is very handy and can save performance overhead which comes with use of synchronization in Java