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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© a3330682 中级黑马   /  2014-4-27 20:43  /  971 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 a3330682 于 2014-4-27 21:23 编辑
  1. public class NumberManager {
  2.         private int lastNumber = 0;
  3.         private List queueNumbers = new ArrayList();
  4.         
  5.         public synchronized Integer generateNewNumber(){
  6.                 queueNumbers.add(++lastNumber);
  7.                 return lastNumber;
  8.         }
  9.         
  10.         public synchronized Integer fetchNumber(){
  11.                 if(queueNumbers.size()>0){
  12.                         return (Integer)queueNumbers.remove(0);
  13.                 }else{
  14.                         return null;
  15.                 }
  16.         }
  17. }
复制代码
张老师说这里两个线程处理同理个数据需要同步;这里只是一个往集合里添加元素一个移除元素,貌似不会产生异常啊?还有就是是不是只要是不同线程处理相同数据就一定要线程同步啊?

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

5 个回复

倒序浏览
移除元素的线程,怎么知道集合中添加的元素呢?    只要线程运行的代码超过一行,一般都要同步
回复 使用道具 举报
刚才没看代码,现在看了下,你确定这是多线程??我怎么没看到第二个线程呢?
回复 使用道具 举报
我想说的是,当一个数据需要保证一个一个的拿,拿到头就停住。这样的情况就要使用同步机制,就是加锁,或者说保证只有一个线程进入,执行代码,等待线程执行完毕,下一个线程才能进入。
张老师的银行调度系统的 数字机器里的添加票和拿走票,一次只能让一个人,或者一个线程操作,所以需要进行加锁,同步起来,保证一个线程一个线程的进来,这样就有了安全性。
以后,遇到一些数据需要增加或者减少,并且需要保证安全性,又使用到多线程,就使用同步机制。一般来说就是同步函数,或者加lock锁

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 25分!恭喜

查看全部评分

回复 使用道具 举报
从你的问题中“这里只是一个往集合里添加元素一个移除元素”就可以知道这涉及到多个线程同时操作一个对象,这个对象就是集合,你想一想,如果一个线程在操作集合的同时,没有使用同步锁,这个时候其他的线程也来了,操作的也是这个集合,会不会造成危害呢,加入这个集合里面存储的是从1-100的火车票号码,你在买票的同时,另一个人也在买票,这样你买到的是20号,那么他买到的也可能是20号,因为你们两同时都买票,就好像两个线程同时操作了一个集合一样。所以这里是涉及到多线程的。
你的最后一个问题:当多个线程同时操作同一个数据的时候,这时候就会涉及到线程安全,我们想要这个数据在某一个时刻只能被一个线程所访问,那么就需要用到线程同步,也就是使用synchronized修饰访问该数据的代码块
希望能帮助到你。。。。。。。。。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
只要多条线程同时操作一份数据就需要同步。因为涉及到cpu随机切换执行权的问题。添加和删除都是操作一样的数据。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马