Abstract. Designing and implementing a concurrent system or application requires great care and remains one of the challenging tasks of software architects and programmers. Also, to make the scenario even worst, errors in concurrent systems are hard to find and sometimes arise in very unexpected ways. For instance, consider the following quote from Eckel's book 'Thinking in Java':

"Some examples were developed on a dual-processor Win2K machine which would immediately show collisions. However, the same example run on single-processor machines might run for extended periods without demonstrating a collision — this is the kind of scary behavior that makes multithreading difficult."

So why the heck one should bother to design and implement such applications?

The reason is that concurrency is becoming a pervasive feature of modern systems and applications which are more and more distributed and communication-centred.

In these lectures we'll consider basic concepts about concurrency and learn how to use them in the specification of concurrent systems. The course will cover the following topics:

analysis of primitives for concurrent systems (...informally)

abstractions for concurrent systems

basic process algebras

automata-based models of concurrency

notions of equivalences for concurrent systems

This seminar has been funded by the Autonomous Region of Sardinia through the Visiting Professor Program 2011.