It has been my experience that S3077 always generates false positives for the projects on which I work. The intent of the rule appears to be to indicate that using “volatile MyObject myRef” does not guarantee that different threads will see updates to the object referenced by “myRef”, which is correct. However, in my experience, use of “volatile” has only ever been used to guarantee that different threads will see updates to myRef, itself, not to the object it references. (On the other hand, I have found that code that uses “volatile” for primitive, mutable values other than boolean is almost always incorrect.)
The workaround, to use AtomicReferences, obfuscates the code.