Single Threaded Execution Pattern

如果不使用Single Threaded Exception Pattern:

门类:

人类:

 

 main:

执行结果:

为什么会有broken(损坏):

Gate是非线程安全的类。
测试并无法证明安全性,当测试次数不够、时间点不对就可能检查不到问题:
调试的消息也不可靠:

 

由多个人仔细阅读程序源代码,检查是否会产生问题,才是确保程序安全性最有效的方法。
 
修改后:
使用SingleThreadedExecutionPattern
保护范围:
 
 
 
只需要改非线程安全类Gate就行了:

为什么不?

因为:
要保护的是name与address的统一性,他们两个是合在一起的。

为什么要在tostring方法加synchronized?

为什么check方法又不加synchronized?
——因为只有pass方法调用check方法,而pass方法已经加上synchronized了

是获取谁的锁定来保护的呢????

如果实例不同,那锁定也不同了。如果有多个相异实例,那多个线程仍然可以分别执行不同实例的synchronized方法。

必须只让单线程执行的程序范围,称为临界区。
何时使用SingleThreadedExecutionPattern:
 
  • 多线程时
  • 数据可以被多个线程访问的时候
  • 状态可能变化的时候
  • 需要确保安全性的时候
 
SingleThreadedExecutionPattern的生命性与死锁  

SingleThreadedExecutionPattern的可重用性与继承异常:
若写了一个SharedResource参与者的子类,在子类中若unsafeMethod不定义成synchronized,就无法保证sharedResource参与者的安全性s。
(解释:unsafeMethod,是指线程不安全的类,在父类和子类中都要被定义为synchronization)
 
临界区的大小与执行性能:
使用SingleThreadedExecutionPattern致使性能低的两个原因:
1.获取锁定需要花费时间
2.线程冲突时必须等待

 

 

posted @ 2019-07-08 18:15  TangXinPing  阅读(185)  评论(0编辑  收藏  举报