To enhance performance, future software applications will rely on exploiting parallelism. Many computers are now available with multiple processors to enhance performance. While parallelism can enhance the performance of large computations, concurrency is also necessary for simple computations where blocking is a performance bottleneck, for example, servers accessing data on disk or across a network may block for long periods of time, which introduces unacceptable delays. The solution is to make the server (or system) multi-threaded (multi-tasking) so that it can continue to perform other work. Therefore, concurrency is necessary in an ever increasing body of software, even when computational performance is not the ultimate goal.