AS3中实现同步(多线程同步技术)

本文介绍了AS3中实现同步使用Mutex类和Condition类的原理与方法。通过示例展示了如何利用Condition进行线程间的通信,包括wait、notify和notifyAll的区别,以及在共享资源读写中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备篇

1.实现同步

2.认识死锁

3.Condition是啥

总结

 

我们知道AS3中实现同步使用的是Mutex类,那么Condition可以看做扩展了Mutex类功能的类,首先我们看看Condition的构造方法:

 

public function Condition(mutex:Mutex)

 

说明Condition类是基于一个Mutex对象的,且其mutex属性为只读,说明其扩展了某一个Mutex对象就不能更改为其它的Mutex对象;

 

再看看Condition提供的方法:

public function notify():void
public function notifyAll():void
public function wait(timeout:Number = -1):Boolean

 

大家学Worker时一定很纳闷,有start开始运行、有terminate终止运行,怎么没有sleep或者wait方法来暂停线程运行呢?看到这里是不是忽然明白了,暂停执行的方法被放到Condition类中了,而且可以指定暂停的时间;当一个Condition对象调用wait方法后,该对象所在的线程就会暂停指定的时间,-1表示一直暂停执行;

 

好的,我们再看看Condition的意思是啥?(为了照顾和我一样英语没过4级的童鞋)

condition  [k?n'di??n] 
n.条件, 情况
v.训练, 决定, 以 ... 为条件, 护理(头发)

 

Condition是条件的意思:即线程执行的条件,满足条件可以执行,不满足条件可以暂停的意思;

 

wait方法可以暂停当前线程,那么相应的notify和notifyAll就是继续运行的方法,由于同一时间一个Condition对象可能暂停了多个线程,所以无论再哪个线程中调用notify或notifyAll方法都会导致等待中的多个线程中的一个线程继续执行;好吧就是这么简单。

那么notify和notifyAll有啥区别呢?

 

API文档:

notify():void
指定此 Condition 对象表示的条件已经满足,mutex 的所有权将被返回给正等待此条件的下一个 worker(如果有)。

notifyAll():void
指定此 Condition 对象表示的条件已经满足,mutex 的所有权将被返回给正等待此条件的所有 worker。

 

好吧,我抄录了Java中的notify和notifyAll区别供各位看官参考:

notify和notifyAll最大区别在于:
notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。
notify他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁,此时如果该对象没有再次使用notify语句,即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。

 

下面我们直接上一个实例:

 

创建ConditionDemo工程,主线程和子线程同时运行,子线程向共享字节流中写入一个字符串,主线程则读出该字符串,注意我们没有使用MessageChannel来实现,而是用Condition来实现;

 

当共享字节流中没有数据时主线程会暂停,子线程写入数据后调用notify方法通知主线程后暂停,主线程继续运行后发现存在数据读出该数据,同时调用notify方法通知子线程后暂停;如此反复20次,输出如下:

 

  1. 写入数据 43
  2. 读出数据: 这次程序能不能跑通啊?!46
  3. 写入数据 48
  4. 读出数据: 这次程序能不能跑通啊?!50
  5. 写入数据 54
  6. 读出数据: 这次程序能不能跑通啊?!56
  7. 写入数据 58
  8. 读出数据: 这次程序能不能跑通啊?!60
  9. 写入数据 61
  10. 读出数据: 这次程序能不能跑通啊?!63
  11. 写入数据 67
  12. 读出数据: 这次程序能不能跑通啊?!69
  13. 写入数据 71
  14. 读出数据: 这次程序能不能跑通啊?!73
  15. 写入数据 75
  16. 读出数据: 这次程序能不能跑通啊?!77
  17. 写入数据 80
  18. 读出数据: 这次程序能不能跑通啊?!82
  19. 写入数据 84
  20. 读出数据: 这次程序能不能跑通啊?!87
  21. 写入数据 89
  22. 读出数据: 这次程序能不能跑通啊?!91
  23. 写入数据 94
  24. 读出数据: 这次程序能不能跑通啊?!96
  25. 写入数据 100
  26. 读出数据: 这次程序能不能跑通啊?!101
  27. 写入数据 103
  28. 读出数据: 这次程序能不能跑通啊?!106
  29. 写入数据 108
  30. 读出数据: 这次程序能不能跑通啊?!110
  31. 写入数据 113
  32. 读出数据: 这次程序能不能跑通啊?!116
  33. 写入数据 118
  34. 读出数据: 这次程序能不能跑通啊?!120
  35. 写入数据 123
  36. 读出数据: 这次程序能不能跑通啊?!126
  37. 写入数据 128
  38. 读出数据: 这次程序能不能跑通啊?!131
  39. 写入数据 135
  40. 读出数据: 这次程序能不能跑通啊?!137
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值