Concurrent and Distributed programming
These are some of the concurrent problems solved using Semaphores, Mutually-exclusive regions and monitors. These same problems are solved in distributed programming. It is all solved using Java, for distributed part i've been using Sockets and Remote Method Invocation (RMI).