论坛首页 招聘求职论坛

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

浏览 34244 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-01  
这里的错好象还不是if的问题,虽然正常情况下要用while, 我觉得是POP方法里面的wait()后只会释放this,不会释放list,其他的线程会被阻塞.而其它线程进入synchronized(this)后需要list的锁,阻塞在这里而又不会释放this,形成死锁.不知道对不对?
0 请登录后投票
   发表时间:2007-06-05  
wait() 方法应始终在循环中使用。
0 请登录后投票
   发表时间:2007-06-05  
我想知道这样的程序什么时候能用的到?
为了炫耀自己会这个?
0 请登录后投票
   发表时间:2007-06-05  
针对楼上的观点我是这样想的:
1)少人用不等于没有用,有些公司做的软件就是要跟Thread和I/O这些打交道的,比如说网管系统,那人家当然要求应聘的人要有这方面的经验,这也很过分么?
2)话又说回来,你既然要到这家公司去应聘,那就应该事前做些人家公司的调查,起码知道人家是做什么的,这样就算人家出题考你,你也大概知道他们会考些什么。而不是看到人家的考题才发出这样的感叹,事前都干什么去了。

机会是给有准备的人的,找工作是要有目的,要做好功课才能找到适合自己的工作,而不是盲头苍蝇的到处去碰运气。随便换个工作只会导致频繁的换工作,恶性循环。
0 请登录后投票
   发表时间: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还要堵塞在那里等,线程上下文切换很昂贵地。
0 请登录后投票
   发表时间:2007-06-07  
不用这么较真,大体意思明白就行了。
线程上下文切换,什么意思?

java language spec中 强调了 notify()/if的风险,
建议使用notifyAll()/while,性能差点总比出问题好。
0 请登录后投票
   发表时间:2007-06-07  
just4you 写道
我想知道这样的程序什么时候能用的到?
为了炫耀自己会这个?


穷其所以然。
0 请登录后投票
   发表时间: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)

报错。。。不知道为什么。。。
0 请登录后投票
   发表时间: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 是什么原因?我看了帖子,说是唤醒后不会再判断了?不是很明白?能不能说的详细点,我就这里不明白?
0 请登录后投票
   发表时间:2007-06-07  
wait()醒来之后确认可以执行后才执行,因为线程并不知道是什么原因被唤醒的,
也称为 guard condition pattern。
0 请登录后投票
论坛首页 招聘求职版

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