A Comparative Study of Programming Models for Concurrency