-Author Unknown
A collary, seen recently:
"You have a problem. You decide to solve it using threads. problems Now have two you."
Hm, I can see that; concurrency isn't really taught well -- and it's sad that a lot of languages rely on the OS-thread/library method rather than designing for it.
Because if it was a language-level part of the language you could apply static-analysis (and, prior that, design the threading to eliminate some of the common errors encountered w/ threading). [Ada's TASK construct, using rendezvous, and more recently [Ada 95] protected objects, are examples of the language addressing the problem.]
But it seems that "the industry" will be sticking with the add-on/afterthought method for a while. :|