So lately I've been reading a lot of article about how concurrent programming is hard, and how concurrent programming with shared state is near impossible. So languages like Erlang (I think this is on, if not the question still makes sense) use the Actor model for concurrency and have no shared state between threads. Now in my time programming concurrent systems I've not found concurrency to be that hard - but in general I can fit almost any problem into the producer/consumer paradigm and live without much (if any) shared state. Although is that correct? Are the message queues between threads actually shared state? Or is the producer/consumer model of concurrent programming really a concrete example of the Actor model (that's my real question). Thoughts?