That&#x27;s true, and it&#x27;s true of most languages, and unfortunately people trip over it even when they can totally avoid it by hiding threads behind other abstractions. So yeah, silly of me to have forgotten it.<p>That said, AFAIK <i>language-level</i> invariants in Java (and Python, etc.) cannot be violated by the lack of thread safety; meaning, you can still inspect every live object and see its state. <i>Program-level</i> invariants might go to heck, for sure. So what I should have said is more along the lines of &quot;memory safety&quot; than &quot;lack of undefined behavior&quot;; I&#x27;m not sure what the shortest and most precise way to put it is, though. (It does not quite end with memory safety but it doesn&#x27;t quite get to lack of undefined behavior, either.)