精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-21
修改是没有问题,只是跟下面这个版本没有本质的区别:
class Stack { LinkedList list = new LinkedList(); public synchronized void push(Object x) { synchronized(list) { list.addLast( x ); notify(); } } public synchronized Object pop() { while( list.size() <= 0 ) wait(); synchronized(list) { return list.removeLast(); } } } 说白了是因为synchronized(list)在这里是多余的,所以绕来绕去都离不开怎么避开这个锁。不过解决方法好象也只能这样了。 |
|
返回顶楼 | |
发表时间:2007-05-21
恩,lz以后多发发这方面的问题。
多线程方面,大家可以看看,http://java.sun.com/docs/books/jls/ 还有一本书《java多线程设计模式》,推荐。 |
|
返回顶楼 | |
发表时间:2007-05-21
可以举个例子说明,什么时候需要用双重的synchronized?
我也编过不少代码,不过的确没碰到过需要两重同步的,请教了!谢谢 |
|
返回顶楼 | |
发表时间:2007-05-22
嵌套监视器的例子还是有的,比如说你的一个对象里要使用锁,然后这个对象引用的另外一个对象也是有同步锁的,很明显两个对象使用的不是同一个锁,这就很有可能出现嵌套了,但不一定会出现上面例子的情况,除非锁对象对外界是可见的。
很多教科书上讲死锁都会举嵌套监视器的例子,只是他们的例子想说明的是嵌套监视器时顺序要一致,跟上面的例子不一样。上面的例子的点在使用嵌套监视器时wait和notify的误用。 |
|
返回顶楼 | |
发表时间:2007-05-22
怎么才能打一开
synchronized的锁呢 用程序可否打开? 比如销毁实例? |
|
返回顶楼 | |
发表时间:2007-05-22
只能退出synchronized块,或调用x.wait能够打开对x的锁
|
|
返回顶楼 | |
发表时间:2007-05-22
synchronized 的两大缺点:
无法指定一个超时值, 无法中断一个正在等待请求锁的线程。 无法安全地请求多个锁 。(多个锁只能以依次序获得。)。 |
|
返回顶楼 | |
发表时间:2007-05-27
好像天书
|
|
返回顶楼 | |
发表时间:2007-05-29
differ1 写道 可以举个例子说明,什么时候需要用双重的synchronized?
我也编过不少代码,不过的确没碰到过需要两重同步的,请教了!谢谢 有的 不知道你写过threadpool么 当然也可以避免 但是处理起来比较繁琐 <Thread, ControlRunnable> // ControlRunnable implements Runnable, my monitor 比如我有一个线程等待队列, 在池中的线程一旦处理ready就会去queue里取request 很明显是 synchrnoized(thread){ process(); fetch(queue); } 但是ControlRunnable是一个监控线程 比如它会handle一些lifecycle event 那么需要synchronized(controlRunnable){ controlRunnable.wait(xxx); if(conditionInvalid){ ......... } } 但是我们在哪儿开始监控呢 明显是process前 包括后面的notify都是nested sync monitor 其实这样看更直观 initialInterval &initial_1 enterInterval(&initial_1) initialInterval &intiial_2 enterInterval(&intiial_2) process_() leaveInterval(&initial_2) process() leaveInterval(&initial_1) 明显这个是遵守2阶段锁的 但不保证不死锁 所以就是LZ举的例子 <code> public synchronized void push(Object x) { synchronized(list) { list.addLast( x ); notify(); } } public synchronized Object pop() { synchronized(list) { if( list.size() <= 0 ) wait(); return list.removeLast(); } } </code> initialInterval &initial_this enterInterval(&initial_this) initialInterval &initial_list enterInterval(&initial_list) wait(&initial_this) enterInterval(&initial_this) enterInterval(&initial_list) //Deadlock... |
|
返回顶楼 | |
发表时间:2007-05-29
监视器用错了!!
|
|
返回顶楼 | |