You can always start out with the Dining Philosophers problem. Doing a google search will produce about 10000 web sites with java applets that show it in action and in depth explinations of how it works. I remember my first CS professor freshmen year in college using that problem to teach semaphore logic. It is best to make sure you have a good understand of what a semaphore is, and what the problems associated with them can be logically before you start trying to write code. It can be super frustrating when you have a stalled semephore and just can't figure out why.
I would recommend a book but quite honestly I haven't read one that I felt was easy enough to understand unless you already know what a semaphore is.....
This link has some info as well. And try reading the man page on semget, semop, and semctl.