一个全局变量list,里面放的是排行榜的信息,所有用户都可以读取,到某一个固定的时间调用重排序的方法,这个时候应该是把这个list给锁住,不让玩家调用了,否则会出现数据错乱,请教大家应该怎么办,对于锁不是很熟,不知道该怎么写

解决方案 »

  1.   

    最笨的办法,把list改成vactor对象,就可以了。
      

  2.   

    问题是在排序过程中如果有用户读取了(通过刷新)排名信息,这时候的信息就可能是非法信息(既不是之前旧的排名信息,也不是之后新的排名信息)
    写过程中不允许读体现了线程安全,之前提到的Vector应该不错,也可以对list进行同步,比如通过同步方法就可以保证在调用写方法时无法调用读方法
      

  3.   

    因为大大小小几十个list,要是改成Vector或者别的数据结构的话会工程量比较大,请问如果用同步方法怎么实现呢,谢谢,这块实在很弱
      

  4.   

    是直接List list = new ArrayList();
    改成List list = new Vactor();就可以了吗?
      

  5.   

    应该可以,Vector是实现了List的关于同步方法
    public class Test {

        public synchronized void setList(List list) {

        }

        public synchronized List getList() {
            return list;
        }}
      

  6.   

    我还是贴代码吧,可能之前描述的不是很清楚public class RolePetRankController{ private GameRolePetService gameRolePetService; public static List<GameRoleForRank> petLevelList = new ArrayList<GameRoleForRank>();
    private long readDataTime;// 系统时间 @Override
    public void handleRequest(HttpServletRequest request, GameRole role,
    Map<String, Object> map) throws Exception { compareTime();
    List<GameRoleForRank> list = RolePetRankController.petLevelList  } /**
     * 初始化信息
     */
    public void Init() {
    this.readDataTime = System.currentTimeMillis();
    Map<Integer, Integer> map = new HashMap<Integer, Integer>(); {
    GameRoleForRank gameRoleForRank = new GameRoleForRank();
    gameRoleForRank.setOrderByPetLevel(-1);
    gameRoleForRank.setLimit(100);
    gameRoleForRank.setOffset(0);
    RolePetRankController.petLevelList = new ArrayList<GameRoleForRank>();
    List<GameRoleForRank> petLevelList = gameRolePetService
    .selectGamePetForRank(gameRoleForRank);
    RolePetRankController.petLevelList = petLevelList;
    GameRoleForRank gameRolePetNumForRank = new GameRoleForRank();
    List<GameRoleForRank> skillList = gameRolePetService
    .selectSkillCountForRank(gameRolePetNumForRank);
    for (int i = 0; i < skillList.size(); i++) {
    GameRoleForRank skillForRank = skillList.get(i);
    if (!map.containsKey(skillForRank.getOid())) {
    map.put(skillForRank.getOid(), skillForRank
    .getPetSkillNum());
    }
    } for (int j = 0; j < RolePetRankController.petLevelList.size(); j++) {
    GameRoleForRank skillForRank = RolePetRankController.petLevelList
    .get(j);
    if (map.containsKey(skillForRank.getPetOid())) {
    int count = map.get(skillForRank.getPetOid());
    RolePetRankController.petLevelList.get(j).setPetSkillNum(
    count);
    } else {
    RolePetRankController.petLevelList.get(j).setPetSkillNum(0);
    }
    }
    }
    } /**
     * 比较时间,超过重取数据
     */
    public void compareTime() {
    // 如果时间超过24小时,重新获得一下数据
    if (System.currentTimeMillis() >= (this.readDataTime + 86400000l)) {
    this.Init();
    }
    }其中Init()方法,系统启动的时候调用,用户的每次查询都调用比较方法,如果超过24小时就重排,请问该怎么解决,谢谢大家
      

  7.   

    楼上的是说,要么把ArrayList改成Vactor,要么把list的同步get,set方法暴露出来,是吧
      

  8.   

    public static List list = new ArrayList();
    private list sortList(){
           synchronized (list) {
       //你的排序逻辑
    }
      return this.list;
    }
      

  9.   


    你在GET上加同步的话 只是在调用GET方法的时候同步了这个方法,要在排序的过程中对LIST对象进行同步