Java in Distributed Systems: Concurrency, Distribution and Persistence