设计模式之singleton (原创)

今天老师讲了单件模式,这个模式比较容易学,就开始讲这个。

不过俺至今还没发现它有什么特殊用途,虽然,在网上有搜到一些资料关于它的用处。

这个模式充分利用了私有的构造函数来解决其他类不能new它,也就是不能实例化它。造成了只有一个对象的情况,在某些设计下,只允许一个对象存在的情况,就使用该模式是最佳选择(当然最好也是在单线程下)

还有就是在singleton模式下,是不能让类序列化它,即不能加serilizable属性。那样也可能会造成多对象的情况,还有就是不能支持Iconeable接口,就是不能克隆。这个问题显而易见。。。nonsense

在这里我说说为什么单件模式在多线程下不爽。

1 但一个线程走到  if(thisobject != null)这个判断条件的时候,可能正在这个时候cpu的时间片转移给了另外的线程,但在cpu还没有将时间片转移给线程一的时候,它有执行了另外一个线程,启用了 if(thisobject != null)这个判断条件并判别为true了,这样一来,当cpu分别把时间片转交给线程一和线程二的时候,他们两个线程均已经执行完了判断条件,都会认为是true,所以执行下面的语句:new thisobject();悲剧也就发生了。。。。

 

关于单件模式在多线程下的解决办法,老师说的是用lock,但在讲课的时候好像没有成功,他想lock这个对象,但对象其实还没有创建成功,怎么lock?

不过,解决的办法还是有的。。。。可以lock静态变量,加上typeof,呵呵,或者是增添一个object,这个是专门为这个锁机制而创建的,没别的用,或者是做一个静态的只读变量。。。。不过俺没试过,不知道怎么检查多线程下的运行,是怎么怎么滴。。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值