You shouldn't make any assumptions about threads seeing values modified by other threads unless you synchronize on the access or make the variables volatile.
Any other behaviour is unreliable and subject to change.
Remember that Java is running on the JVM, not directly on your processor, and has license to make a LOT of optimisations to your running code. So while a lot of the behaviour carries over you cannot rely upon it. Especially since as soon as you run on different architecture or under different conditions the exact same bytecode may be optimised differently.