黑马程序员技术交流社区
标题:
关于线程同步问题
[打印本页]
作者:
a3330682
时间:
2014-4-27 20:43
标题:
关于线程同步问题
本帖最后由 a3330682 于 2014-4-27 21:23 编辑
public class NumberManager {
private int lastNumber = 0;
private List queueNumbers = new ArrayList();
public synchronized Integer generateNewNumber(){
queueNumbers.add(++lastNumber);
return lastNumber;
}
public synchronized Integer fetchNumber(){
if(queueNumbers.size()>0){
return (Integer)queueNumbers.remove(0);
}else{
return null;
}
}
}
复制代码
张老师说这里两个线程处理同理个数据需要同步;这里只是一个往集合里添加元素一个移除元素,貌似不会产生异常啊?还有就是是不是只要是不同线程处理相同数据就一定要线程同步啊?
作者:
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