1700475000
1700475001
1700475002
1700475004
设计模式之禅 28.4 享元模式的扩展
1700475005
1700475006
28.4.1 线程安全的问题
1700475007
1700475008
线程安全是一个老生常谈的话题,只要使用Java开发都会遇到这个问题,我们之所以要在今天的享元模式中提到该问题,是因为该模式有太大的几率发生线程不安全,为什么呢?
1700475009
1700475010
我们还以报考系统为例来说明这个问题。大家有没有想过,为什么要以考试科目+考试地点作为外部状态呢?为什么不能以考试科目或者考试地点作为外部状态呢?这样池中的对象会更少!可以!完全可以!我们把程序以考试科目为外部状态,把享元工厂稍作修改,如代码清单28-10所示。
1700475011
1700475012
代码清单28-10 报考信息工厂
1700475013
1700475014
public class SignInfoFactory{
1700475015
1700475016
//池容器
1700475017
1700475018
private static HashMap<String,SignInfo>pool=new HashMap<String,SignInfo>();
1700475019
1700475020
//从池中获得对象
1700475021
1700475022
public static SignInfo getSignInfo(String key){
1700475023
1700475024
//设置返回对象
1700475025
1700475026
SignInfo result=null;
1700475027
1700475028
//池中没有该对象,则建立,并放入池中
1700475029
1700475030
if(!pool.containsKey(key)){
1700475031
1700475032
result=new SignInfo();
1700475033
1700475034
pool.put(key,result);
1700475035
1700475036
}else{
1700475037
1700475038
result=pool.get(key);
1700475039
1700475040
}
1700475041
1700475042
return result;
1700475043
1700475044
}
1700475045
1700475046
}
1700475047
1700475048
下面做很小的改动,只修改了黑色字体部分。为了展示多线程的情况,我们写一个多线程的类,如代码清单28-11所示。
1700475049
[
上一页 ]
[ :1.700475e+09 ]
[
下一页 ]