精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-06-01
这里的错好象还不是if的问题,虽然正常情况下要用while, 我觉得是POP方法里面的wait()后只会释放this,不会释放list,其他的线程会被阻塞.而其它线程进入synchronized(this)后需要list的锁,阻塞在这里而又不会释放this,形成死锁.不知道对不对?
|
|
返回顶楼 | |
发表时间:2007-06-05
wait() 方法应始终在循环中使用。
|
|
返回顶楼 | |
发表时间:2007-06-05
我想知道这样的程序什么时候能用的到?
为了炫耀自己会这个? |
|
返回顶楼 | |
发表时间:2007-06-05
针对楼上的观点我是这样想的:
1)少人用不等于没有用,有些公司做的软件就是要跟Thread和I/O这些打交道的,比如说网管系统,那人家当然要求应聘的人要有这方面的经验,这也很过分么? 2)话又说回来,你既然要到这家公司去应聘,那就应该事前做些人家公司的调查,起码知道人家是做什么的,这样就算人家出题考你,你也大概知道他们会考些什么。而不是看到人家的考题才发出这样的感叹,事前都干什么去了。 机会是给有准备的人的,找工作是要有目的,要做好功课才能找到适合自己的工作,而不是盲头苍蝇的到处去碰运气。随便换个工作只会导致频繁的换工作,恶性循环。 |
|
返回顶楼 | |
发表时间:2007-06-07
引用 max.h.chen
现在把测试程序给出来: public class ThreadWait { public static void main(String[] args) { final Stack stack = new Stack(); Thread t1 = new Thread() { public void run() { System.out.println(Thread.currentThread().getName() + " is running...."); try { stack.pop(); } catch (Exception e) {e.printStackTrace();} System.out.println(Thread.currentThread().getName() + " end...."); } }; Thread t2 = new Thread() { public void run() { try { Thread.sleep(1000); } catch (Exception e) {e.printStackTrace();} System.out.println(Thread.currentThread().getName() + " is running...."); stack.push(new Object()); System.out.println(Thread.currentThread().getName() + " end...."); } }; t1.start(); t2.start(); } } 这种测试代码怎么测并发?怎么也得能个while循环吧。 to qieqie: 不用notifyall+span lock一样能解决同步问题,notify+if也可以做到,这样性能还好些。比如 class Stack { private final LinkedList list = new LinkedList(); public void push(Object x) { synchronized(list) { list.addLast( x ); list.notify(); } } public Object pop() { synchronized(list) { if( list.size() == 0 ) list.wait(); return list.removeLast(); } } } 话说回来了,就算避免了死锁,这样的stack能用吗? pop还要堵塞在那里等,线程上下文切换很昂贵地。 |
|
返回顶楼 | |
发表时间:2007-06-07
不用这么较真,大体意思明白就行了。
线程上下文切换,什么意思? java language spec中 强调了 notify()/if的风险, 建议使用notifyAll()/while,性能差点总比出问题好。 |
|
返回顶楼 | |
发表时间:2007-06-07
just4you 写道 我想知道这样的程序什么时候能用的到?
为了炫耀自己会这个? 穷其所以然。 |
|
返回顶楼 | |
发表时间:2007-06-07
Thread-0 is running....
java.lang.IllegalMonitorStateException: current thread not owner at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Unknown Source) at com.maodajun.lib.Stack.pop(Stack.java:51) at com.maodajun.lib.ThreadWait$1.run(ThreadWait.java:35) Thread-0 end.... Thread-1 is running.... java.lang.IllegalMonitorStateException: current thread not owner at java.lang.Object.notify(Native Method) at com.maodajun.lib.Stack.push(Stack.java:42) at com.maodajun.lib.ThreadWait$2.run(ThreadWait.java:46) 报错。。。不知道为什么。。。 |
|
返回顶楼 | |
发表时间:2007-06-07
我想问一下:
class Stack { LinkedList list = new LinkedList(); public synchronized void push(Object x) { synchronized(list) { list.addLast( x ); notify(); } } public synchronized Object pop() { synchronized(list) { while( list.size() <= 0 ) wait(); return list.removeLast(); } } } 这里面的if换成while 是什么原因?我看了帖子,说是唤醒后不会再判断了?不是很明白?能不能说的详细点,我就这里不明白? |
|
返回顶楼 | |
发表时间:2007-06-07
wait()醒来之后确认可以执行后才执行,因为线程并不知道是什么原因被唤醒的,
也称为 guard condition pattern。 |
|
返回顶楼 | |