今天老师讲了单件模式,这个模式比较容易学,就开始讲这个。
不过俺至今还没发现它有什么特殊用途,虽然,在网上有搜到一些资料关于它的用处。
这个模式充分利用了私有的构造函数来解决其他类不能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,这个是专门为这个锁机制而创建的,没别的用,或者是做一个静态的只读变量。。。。不过俺没试过,不知道怎么检查多线程下的运行,是怎么怎么滴。。。。