My favorite (having not read the post but just gone through CS undergrad in Java about four times by weight) was the mandatory locking in multithreaded programs in Java -- you can have parent threads and child threads, and you can set variables in your parent threads before the child threads execute, but unless you're doing it in a locking way (eg. with a shared semaphore) there's no guarantee that the parent thread actually executes before the child thread.
That was a fun one to explain in office hours.
"No no, it's not enough to just put this before that, you have to establish a Happens-Before relationship."
That was a fun one to explain in office hours.
"No no, it's not enough to just put this before that, you have to establish a Happens-Before relationship."