IN 1995, WHEN I WAS IN MY SECOND YEAR IN COLLEGE, I was introduced to UNIX network programming. In C, you could create sockets to open TCP connections to servers and code the servers that accepted these connections. I remember the excitement I felt the fi rst time I created a TCP server: I could accept connections and receive and send messages on them. If I wanted my server to accept many concurrent connections, the common solution was to use threads, and soon I had created my fi rst multi-threaded TCP server. This server accessed a shared data structure, which needed to synchronize the access to.