예제 #1
0
  /** 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();
          }
        }
      }
    }
  }