Advanced Java: Multi-threading Part 3 -- The Synchronized Keyword