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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 思维 高级黑马   /  2014-8-17 14:08  /  756 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 思维 于 2014-8-20 09:48 编辑

今天看张老师的视频,讲到线程同步的问题:顾客提取号码和窗口提取号码,是两个不同的线程,事件相互独立,并且它们访问相同是数据,所以需要加锁让其同步。谁能分析下如果不加锁的话会产生怎么样的错误啊?怎么也想不通
  1. import java.util.*;
  2. //定义号码发生器
  3. public class NumberManager{
  4.         //定义上一次的号码
  5.         private int lastNumber = 1;
  6.         //定义集合,用于存储取出的号码
  7.         private List<Integer> queueNumber = new ArrayList<Integer>();
  8.         //返回新的顾客所取到的号码
  9.         public synchronized Integer generateNewNumber(){
  10.                 //将顾客取出的号码存储到集合中
  11.                 queueNumber.add(lastNumber);
  12.                 return lastNumber++;               
  13.         }
  14.         //返回银行窗口调用的号码
  15.         public synchronized Integer fetchNumber(){
  16.                 Integer number = null;
  17.                 if(queueNumber.size()>0){
  18.                 //从集合中提取最先存入的号码
  19.                         number = queueNumber.remove(0);
  20.                 }
  21.                 return number;
  22.         }
  23. }
复制代码

2 个回复

倒序浏览
第一个同步 假如两条线程都停在 add上方那    添加时有可能会取到同一张票         第二个同步  假如两条线程都停在  null 的下面 ,remove后,就有可能size变为负
回复 使用道具 举报
打了很多。楼上正解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马