What are the various ways of doing concurrency?

I attended a talk today by a professor about algorithms and energy costs. Basically he was trying to show that even though parallel processing can use more cycles total, you can design the circuitry so that it is still faster and uses less power than had you done it linearly.

And of course he pointed out the trend towards multi-core CPUs and how very few people know how to properly handle concurrency at the moment. I am sure I am not the only one who does not necessarily want to parallelize all of their apps thanks to the pain that is usually involved in making an app parallel.

But it made me start thinking about what styles of parallel programming exist out there right now. There is threads with traditional locking, forking, and message passing (in which I think of Erlang or MPI). There is also software transactional memory, but that is not concurrency in itself as it is a way to handle protection of data. That is what I can think of off the top of my head right now.

But is there anything else? Anyone have good links to anything mentioned above to explain it to people who might not be familiar with the concepts? I am just curious to see what the bleeding edge is in terms of concurrency in programming.