同步问题-旋锁模式

原创 2007年09月28日 08:25:00
下午在写计算机网络作业---一个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) 上面说得非常清楚
上面的错误在平时看来很容易发现,但是在具体用到同步操作时候(尤其是像我这种初学者^^),很容易犯,所以记下来,供自己和别人参考。

第43篇白板同步延迟问题解决方案解决(五)及data传输模式分析(二)

关键词:白板同步延迟问题, data传输模式分析, 白板同步延迟问题解决方案总结果 一、data传输模式分析 1.1 线条图片传输之断线重连或连接刚建立时的数据同步            if...
  • SanBaDao
  • SanBaDao
  • 2016年12月27日 21:14
  • 434

单例中的多线程同步写法与分析

在项目开发中,大多数人都会用到单例模式,单线程的常规单例模式写法这里不再赘述,这里只是想对多线程的单例设计模式进行一下描述与分析,提到多线程,大家就会想到线程安全,因此所有人都会想到同步方法,确实应该...
  • u011573355
  • u011573355
  • 2016年02月03日 18:05
  • 895

Java 多线程同步问题的探究-经典讲解

Java 多线程同步问题的探究(五、你有我有全都有—— ThreadLocal如何解决并发安全性?)【更新重要补疑】Java 多线程同步问题的探究(四、协作,互斥下的协作——Java多线程协作(wa...
  • liuhl0910
  • liuhl0910
  • 2015年05月20日 15:39
  • 994

JAVA中经典同步问题

当多个线程同时操作一个或多个资源时需要进行同步处理。A线程操作资源时,B线程也操作了资源,会造成数据不同步,从而导致错误出现。 加入同步锁可以防止资源以为多个线程同时操作导致的资源不同步问题。 ...
  • weifeib
  • weifeib
  • 2015年09月18日 19:25
  • 807

5个经典的同步问题

1. 生产者-消费者问题 也叫缓存绑定问题(bounded- buffer),是一个经典的、多进程同步问题。即有两个进程:制造商和消费者,共享一个固定大小的缓存。制造商的工作是制造一段数据,放进...
  • Naruto_ahu
  • Naruto_ahu
  • 2013年03月14日 12:11
  • 9712

【Linux多线程】三个经典同步问题

在了解了《同步与互斥的区别 》之后,我们来看看几个经典的线程同步的例子。相信通过具体场景可以让我们学会分析和解决这类线程同步的问题,以便以后应用在实际的项目中。一、生产者-消费者问题问题描述:一组生产...
  • lisong694767315
  • lisong694767315
  • 2015年04月30日 21:17
  • 3309

同步模块模式

同步模块模式版本一(代码来自《javascript设计模式》–百度工程师) var F = F || {}; F.define = function(str , fn){ var pa...
  • u014458334
  • u014458334
  • 2016年06月27日 00:06
  • 471

设计模式综合实例分析之数据库同步系统(三)

接“设计模式综合实例分析之数据库同步系统(二)“。         6. 策略模式       由于表数据的同步方式有三种,分别是增量同步、先Delete后Insert方式、临时表方式,因此可以定义一...
  • LoveLion
  • LoveLion
  • 2013年03月14日 10:00
  • 8774

捕鱼游戏帧同步方案

设计原则: 玩家在按下的时候,就会看到子弹射出去。这种设计注定了,玩家会收到其他玩家在之前时间射出的子弹优先保证自己的准确性,其他玩家的准确性可惜部分牺牲 同步方案: 服务器按照...
  • esrrhs
  • esrrhs
  • 2017年08月01日 11:31
  • 498

三个多线程同步问题及其实现

.
  • liuyuan185442111
  • liuyuan185442111
  • 2015年11月22日 22:51
  • 814
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:同步问题-旋锁模式
举报原因:
原因补充:

(最多只允许输入30个字)