/** Save all the information of all of the players in the game */ public void saveAll() { JobsDAO dao = plugin.getJobsCore().getJobsDAO(); /* * Saving is a three step process to minimize synchronization locks when called asynchronously. * * 1) Safely copy list for saving. * 2) Perform save on all players on copied list. * 3) Garbage collect the real list to remove any offline players with saved data */ ArrayList<JobsPlayer> list = null; synchronized (players) { list = new ArrayList<JobsPlayer>(players.values()); } for (JobsPlayer jPlayer : list) { jPlayer.save(dao); } synchronized (players) { Iterator<JobsPlayer> iter = players.values().iterator(); while (iter.hasNext()) { JobsPlayer jPlayer = iter.next(); synchronized (jPlayer.saveLock) { if (!jPlayer.isOnline() && jPlayer.isSaved()) { iter.remove(); } } } } }