A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 CrazyProgram 于 2013-4-24 16:47 编辑
  1. //根据id号给候选人投票
  2.         public void updateVoteById(int id,String ip,Object lock) throws Exception{
  3.                 try {
  4.                         //查看最后一次投票的时间
  5.                         Info info = infoDao.lastVoteByIp(ip);
  6.                         //第一次投票的时候
  7.                         if(info==null){
  8.                                 voteDao.updateVoteById(id);
  9.                                 info = new Info();
  10.                                 info.setIp(ip);
  11.                                 infoDao.addInfo(info);
  12.                         }else{
  13.                                 long middle = (System.currentTimeMillis()-info.getVotetime().getTime())/1000;
  14.                                 if(middle>60){
  15.                                         //找到候选人
  16.                                         Vote vote = voteDao.FindVoteById(id);
  17.                                         //判断候选人的票数是否大于100
  18.                                         if(vote.getTicket()<100){
  19.                                                 //可以投票
  20.                                                 synchronized(lock){//这是出问题的,锁不住,锁这个方法也锁不住,求解
  21.                                                         voteDao.updateVoteById(id);
  22.                                                         info.setIp(ip);
  23.                                                         infoDao.addInfo(info);
  24.                                                 }
  25.                                         }else{
  26.                                                 //超过100票不允许在投票了
  27.                                                 throw new OverVoteTicketException();
  28.                                         }
  29.                                        
  30.                                 }else{
  31.                                         throw new NoVoteException();
  32.                                 }
  33.                         }
  34.                 } catch (SQLException e) {
  35.                         e.printStackTrace();
  36.                         throw new Exception();
  37.                 }
  38.         }
复制代码
我看的视频他后面没有给出怎么解决,看的这里,我心很烦,,求解释,synchronized的那一段,lock是自定义的一个Object的对象

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

3 个回复

倒序浏览
  1. //根据id号给候选人投票
  2.         public void updateVoteById(int id,String ip,Object lock) throws Exception{
  3.                 try {
  4.                         //查看最后一次投票的时间
  5.                         Info info = infoDao.lastVoteByIp(ip);
  6.                         //第一次投票的时候
  7.                         if(info==null){
  8.                                 voteDao.updateVoteById(id);
  9.                                 info = new Info();
  10.                                 info.setIp(ip);
  11.                                 infoDao.addInfo(info);
  12.                         }else{
  13.                                 long middle = (System.currentTimeMillis()-info.getVotetime().getTime())/1000;
  14.                                 if(middle>60){
  15.                                         //找到候选人
  16.                                         Vote vote = voteDao.FindVoteById(id);
  17.                                         //判断候选人的票数是否大于100
  18.                                         if(vote.getTicket()<100){
  19.                                                 //可以投票
  20.                                                 synchronized(lock){//这是出问题的,锁不住,锁这个方法也锁不住,求解
  21.                                                         voteDao.updateVoteById(id);
  22.                                                         info.setIp(ip);
  23.                                                         infoDao.addInfo(info);
  24.                                                 }
  25.                                         }else{
  26.                                                 //超过100票不允许在投票了
  27.                                                 throw new OverVoteTicketException();
  28.                                         }
  29.                                        
  30.                                 }else{
  31.                                         throw new NoVoteException();
  32.                                 }
  33.                         }
  34.                 } catch (SQLException e) {
  35.                         e.printStackTrace();
  36.                         throw new Exception();
  37.                 }
  38.         }
复制代码
在第21行的地方,在锁的里面也应该判断下 if(vote.getTicket()<100)   
全部判断完 if(vote.getTicket()<100)  了,然后卡那了,开始锁,
数据肯定还是有错误,因此在同步里面再判断下,也就是说,单线程进入锁后,判断 if(vote.getTicket()<100)

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本人认为在锁的判断条件这里 if(vote.getTicket()<100)改成while(vote.getTicket()<100),这样的话,你的线程在唤醒后都会重新判断。这样就不会出现问题了!
回复 使用道具 举报
嗯,了解了,解决了。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马