Bloqueio duplo verificado em Java - Strings

Dado questrings contêm o campo final, isso significa que, no contexto de bloqueio duplo verificado, não é necessário declará-losvolatile? Por exemplo.

class SomeClass{
     private String val;

     String getVal(){
           if(val == null){
                synchronized(this){
                      if(val ==null)
                           val = new String("foo");
                }
          }
     }
}

Usei uma string como exemplo, mas ela deve funcionar com outros objetos que declaram algum campo final, correto?

questionAnswers(2)

yourAnswerToTheQuestion