黑马程序员技术交流社区

标题: 关于线程同步问题 [打印本页]

作者: a3330682    时间: 2014-4-27 20:43
标题: 关于线程同步问题
本帖最后由 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. }
复制代码
张老师说这里两个线程处理同理个数据需要同步;这里只是一个往集合里添加元素一个移除元素,貌似不会产生异常啊?还有就是是不是只要是不同线程处理相同数据就一定要线程同步啊?

作者: fei_xiong    时间: 2014-4-27 20:59
移除元素的线程,怎么知道集合中添加的元素呢?    只要线程运行的代码超过一行,一般都要同步
作者: fei_xiong    时间: 2014-4-27 21:00
刚才没看代码,现在看了下,你确定这是多线程??我怎么没看到第二个线程呢?

作者: 展展    时间: 2014-4-27 21:04
我想说的是,当一个数据需要保证一个一个的拿,拿到头就停住。这样的情况就要使用同步机制,就是加锁,或者说保证只有一个线程进入,执行代码,等待线程执行完毕,下一个线程才能进入。
张老师的银行调度系统的 数字机器里的添加票和拿走票,一次只能让一个人,或者一个线程操作,所以需要进行加锁,同步起来,保证一个线程一个线程的进来,这样就有了安全性。
以后,遇到一些数据需要增加或者减少,并且需要保证安全性,又使用到多线程,就使用同步机制。一般来说就是同步函数,或者加lock锁
作者: 龙健    时间: 2014-4-27 21:45
从你的问题中“这里只是一个往集合里添加元素一个移除元素”就可以知道这涉及到多个线程同时操作一个对象,这个对象就是集合,你想一想,如果一个线程在操作集合的同时,没有使用同步锁,这个时候其他的线程也来了,操作的也是这个集合,会不会造成危害呢,加入这个集合里面存储的是从1-100的火车票号码,你在买票的同时,另一个人也在买票,这样你买到的是20号,那么他买到的也可能是20号,因为你们两同时都买票,就好像两个线程同时操作了一个集合一样。所以这里是涉及到多线程的。
你的最后一个问题:当多个线程同时操作同一个数据的时候,这时候就会涉及到线程安全,我们想要这个数据在某一个时刻只能被一个线程所访问,那么就需要用到线程同步,也就是使用synchronized修饰访问该数据的代码块
希望能帮助到你。。。。。。。。。
作者: 邵景伦    时间: 2014-4-28 18:03
只要多条线程同时操作一份数据就需要同步。因为涉及到cpu随机切换执行权的问题。添加和删除都是操作一样的数据。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2