- //根据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) |