黑马程序员技术交流社区
标题:
线程并发的问题,同时修改,锁不住包括锁这个方法
[打印本页]
作者:
CrazyProgram
时间:
2013-4-23 20:48
标题:
线程并发的问题,同时修改,锁不住包括锁这个方法
本帖最后由 CrazyProgram 于 2013-4-24 16:47 编辑
//根据id号给候选人投票
public void updateVoteById(int id,String ip,Object lock) throws Exception{
try {
//查看最后一次投票的时间
Info info = infoDao.lastVoteByIp(ip);
//第一次投票的时候
if(info==null){
voteDao.updateVoteById(id);
info = new Info();
info.setIp(ip);
infoDao.addInfo(info);
}else{
long middle = (System.currentTimeMillis()-info.getVotetime().getTime())/1000;
if(middle>60){
//找到候选人
Vote vote = voteDao.FindVoteById(id);
//判断候选人的票数是否大于100
if(vote.getTicket()<100){
//可以投票
synchronized(lock){//这是出问题的,锁不住,锁这个方法也锁不住,求解
voteDao.updateVoteById(id);
info.setIp(ip);
infoDao.addInfo(info);
}
}else{
//超过100票不允许在投票了
throw new OverVoteTicketException();
}
}else{
throw new NoVoteException();
}
}
} catch (SQLException e) {
e.printStackTrace();
throw new Exception();
}
}
复制代码
我看的视频他后面没有给出怎么解决,看的这里,我心很烦,,求解释,synchronized的那一段,lock是自定义的一个Object的对象
作者:
黑马19我最牛
时间:
2013-4-23 20:54
//根据id号给候选人投票
public void updateVoteById(int id,String ip,Object lock) throws Exception{
try {
//查看最后一次投票的时间
Info info = infoDao.lastVoteByIp(ip);
//第一次投票的时候
if(info==null){
voteDao.updateVoteById(id);
info = new Info();
info.setIp(ip);
infoDao.addInfo(info);
}else{
long middle = (System.currentTimeMillis()-info.getVotetime().getTime())/1000;
if(middle>60){
//找到候选人
Vote vote = voteDao.FindVoteById(id);
//判断候选人的票数是否大于100
if(vote.getTicket()<100){
//可以投票
synchronized(lock){//这是出问题的,锁不住,锁这个方法也锁不住,求解
voteDao.updateVoteById(id);
info.setIp(ip);
infoDao.addInfo(info);
}
}else{
//超过100票不允许在投票了
throw new OverVoteTicketException();
}
}else{
throw new NoVoteException();
}
}
} catch (SQLException e) {
e.printStackTrace();
throw new Exception();
}
}
复制代码
在第21行的地方,在锁的里面也应该判断下 if(vote.getTicket()<100)
全部判断完 if(vote.getTicket()<100) 了,然后卡那了,开始锁,
数据肯定还是有错误,因此在同步里面再判断下,也就是说,单线程进入锁后,判断 if(vote.getTicket()<100)
作者:
harborbest
时间:
2013-4-24 08:56
本人认为在锁的判断条件这里 if(vote.getTicket()<100)改成while(vote.getTicket()<100),这样的话,你的线程在唤醒后都会重新判断。这样就不会出现问题了!
作者:
CrazyProgram
时间:
2013-4-24 16:47
嗯,了解了,解决了。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2