hanrentanfei的专栏

人不可以不自爱,不可以不自修,不可以不自尊,不可以不自强,而断不可以自欺---张澜...

同步问题-旋锁模式
下午在写计算机网络作业---一个WebServer(基于HTTP/1.0协议)
打算用线程池来实现 虽然实现了线程池,但是觉得很chuo(很烂),MayBe功能还不如来一个请求开一个线程,先不说这个,但是里面遇到的一个同步控制问题,让我迷惑了一阵子,最后查阅了Practical Java才明白了所以然,其实也就是一个旋锁模式(spin-lock pattern)觉得有必要写下来,如下:
......
synchronized(controller){
if (condition == null){
   try{
       condition.wait();
   } catch(Exceptione ){}
......
condition = null;
}
假设有两个线程需要运行这段代码,如果当condition满足的时候,一个线程抢到了锁,并向后面执行,并将condition赋值为null;如果这时候恰好通过notify唤醒了所有在condition上面等待的线程,则就不会再测试condition是否为null,而是从刚刚执行的condition.wait()后面开始执行,这样就会出现错误,因为codition现在已经是null了。所以应该改成这样:
......
synchronized(controller){
while (condition == null){
   try{
       condition.wait();
   } catch(Exceptione ){}
......
condition = null;
}
用循环,迫使其需要使用condition的线程反复测试,确保其正真获得其锁并执行时候codition是非空的
如果觉得还不清楚的可以去看侯捷翻译的那本Practical Java的中文版中的时间54:针对:wait()和notifyAll()使用旋锁(spain locks) 上面说得非常清楚
上面的错误在平时看来很容易发现,但是在具体用到同步操作时候(尤其是像我这种初学者^^),很容易犯,所以记下来,供自己和别人参考。
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

同步问题-旋锁模式

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭