"Piggybacking" on synchronization
This synchronization is rarely advocated as a design pattern (probably with
good reason), but I've definitely seen incorrectly synchronized production
code that accidentally works by using it! Recall that the Java 5
definition of volatile states that access to a volatile variable
synchronizes local copies of all cached variables with
main memory. Therefore, it is occasionally possible to write to one variable
without synchronization and then take advantage of subsequent synchronization on a
different variable to ensure that main memory is updated with both
Cases where this technique will work are essentially where:
- we know that Thread A will write to
- Thread B (and possibly other threads) will read them;
- there won't be concurrent writes by multiple threads.
Goetz et al (2006: 342-344) briefly
discuss use of this technique in some of the Java class library code.
The obvious problem with the method for general purpose use is that it
may be quite difficult to demonstrate that it is correct in a given circumstance
(and in most cases it will almost certainly not be correct...).