论坛首页 招聘求职论坛

以前为公司出的一道面试题,有点偏,有兴趣的可以试试

浏览 34246 次
精华帖 (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)在这里是多余的,所以绕来绕去都离不开怎么避开这个锁。不过解决方法好象也只能这样了。
0 请登录后投票
   发表时间:2007-05-21  
恩,lz以后多发发这方面的问题。
多线程方面,大家可以看看,http://java.sun.com/docs/books/jls/
还有一本书《java多线程设计模式》,推荐。
0 请登录后投票
   发表时间:2007-05-21  
可以举个例子说明,什么时候需要用双重的synchronized?

我也编过不少代码,不过的确没碰到过需要两重同步的,请教了!谢谢
0 请登录后投票
   发表时间:2007-05-22  
嵌套监视器的例子还是有的,比如说你的一个对象里要使用锁,然后这个对象引用的另外一个对象也是有同步锁的,很明显两个对象使用的不是同一个锁,这就很有可能出现嵌套了,但不一定会出现上面例子的情况,除非锁对象对外界是可见的。
很多教科书上讲死锁都会举嵌套监视器的例子,只是他们的例子想说明的是嵌套监视器时顺序要一致,跟上面的例子不一样。上面的例子的点在使用嵌套监视器时wait和notify的误用。
0 请登录后投票
   发表时间:2007-05-22  
怎么才能打一开
synchronized的锁呢
用程序可否打开?
比如销毁实例?
0 请登录后投票
   发表时间:2007-05-22  
只能退出synchronized块,或调用x.wait能够打开对x的锁
0 请登录后投票
   发表时间:2007-05-22  
synchronized 的两大缺点:
无法指定一个超时值, 无法中断一个正在等待请求锁的线程。
无法安全地请求多个锁 。(多个锁只能以依次序获得。)。
0 请登录后投票
   发表时间:2007-05-27  
好像天书
0 请登录后投票
   发表时间: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...



0 请登录后投票
   发表时间:2007-05-29  
监视器用错了!!
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics