This list is written in no particular order :)
Haskell always fascinates me as a good language for concurrent programming and I got introduced to a new concept by reading this Haskell Resource. This links to a chapter on a Haskell book describing about software transactional memory and how it can become an alternative to lock based approach to synchronization.
This links to a useful explanation about the difference between these two algorithms with historical context (which I always like :)).
This links to a Youtube video explaining about Dekker’s Algorithm (complete with pretty cute animations).
Back to transactional memory, this links to a discussion on what is really the difference between transactional memory based approach and locks based approach to synchronization.
This links to a fun introduction to Lock-Free Data Structure in Java. I think that this is a pretty good resource to get familiar with non-blocking algorithms and lock-free data strucutres.
This links to an explanation to The Dining Philosophers Problem which I found useful to understand the problem.
I stumbled upon the concept of “linearizability” when googling about concurrent programming. This links to a useful question and answer thread that explains about the concept.
This links to a question and answer thread that discusses how non-blocking conccurency is different than ‘normal’ (blocking) conccurency.
This links to a useful site that helps me understand the Banker’s Algorithm.
Very much only tangentially related but when thinking about semaphore, this video came to mind. This links to a Youtube video by Tom Scott explaining the first ever telecom scam, which actually involves semaphore towers.