AbstractSingletonService: add final keywords
AbstractSingletonService: improve thread safety

The double-checked locking will not work unless the assignment is done
at the end of the synchronized block (and maybe not even then:
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html).