一个全局变量list,里面放的是排行榜的信息,所有用户都可以读取,到某一个固定的时间调用重排序的方法,这个时候应该是把这个list给锁住,不让玩家调用了,否则会出现数据错乱,请教大家应该怎么办,对于锁不是很熟,不知道该怎么写
解决方案 »
- 如何在打包时把log4j配置文件排除在外?
- 为什么总是删除Vector的第二个元素呢?
- 应聘的一道题目请高手解答!在线等!
- JAVA中怎样使用JNI?
- 谁有水晶报表java实现的例子或者学习文档,最好是中文的
- 如何用socket得到页面表单post的数据
- 链表小问题,50分!!
- Java中的的参数传递都是传值的!!!这句话对吗??
- 关于字符串替换的问题
- 求助关于java.sql.SQLException: 未调用 ResultSet.next的问题!
- 求排课系统核心算法代码
- 在 JBuilder 2005 里,双击 JTree 的 valueChanged 事件后,一切控件都不见了,这到底是为什么呢?
写过程中不允许读体现了线程安全,之前提到的Vector应该不错,也可以对list进行同步,比如通过同步方法就可以保证在调用写方法时无法调用读方法
改成List list = new Vactor();就可以了吗?
public class Test {
public synchronized void setList(List list) {
}
public synchronized List getList() {
return list;
}}
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小时就重排,请问该怎么解决,谢谢大家
private list sortList(){
synchronized (list) {
//你的排序逻辑
}
return this.list;
}
你在GET上加同步的话 只是在调用GET方法的时候同步了这个方法,要在排序的过程中对LIST对象进行同步