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.线程冲突时必须等待

 

 

转载于:https://www.cnblogs.com/wzdnwyyu/p/11152938.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值