If you’re talking about implementation of the Lock interface, then that’s wrong. The spec says that all implementations must enforce the same memory barrier semantics. Not that that can be guaranteed from an interface, but you can guarantee that the built-in implementations will adhere to it.
Couldn’t agree more! Learn to use lock-free mechanisms, particularly lock-free queues, for passing information around. Praxis’ architecture is designed in this way - there are almost no locks anywhere in the code base (except a couple of places where they’re enforced by 3rd party libs). The first part of this blog post on its architecture (and the linked to post by Ross Bencina) may explain some reasons this is a good idea in general, particularly where you want consistent timing (eg. framerate!)