1700475080
代码清单28-12 场景类
1700475081
1700475082
public class Client{
1700475083
1700475084
public static void main(String[]args){
1700475085
1700475086
//在对象池中初始化4个对象
1700475087
1700475088
SignInfoFactory.getSignInfo(“科目1”);
1700475089
1700475090
SignInfoFactory.getSignInfo(“科目2”);
1700475091
1700475092
SignInfoFactory.getSignInfo(“科目3”);
1700475093
1700475094
SignInfoFactory.getSignInfo(“科目4”);
1700475095
1700475096
//取得对象
1700475097
1700475098
SignInfo signInfo=SignInfoFactory.getSignInfo(“科目2”);
1700475099
1700475100
while(true){
1700475101
1700475102
signInfo.setId(“ZhangSan”);
1700475103
1700475104
signInfo.setLocation(“ZhangSan”);
1700475105
1700475106
(new MultiThread(signInfo)).start();
1700475107
1700475108
signInfo.setId(“LiSi”);
1700475109
1700475110
signInfo.setLocation(“LiSi”);
1700475111
1700475112
(new MultiThread(signInfo)).start();
1700475113
1700475114
}
1700475115
1700475116
}
1700475117
1700475118
}
1700475119
1700475120
模拟实际的多线程情况,在对象池中我们保留4个对象,然后启动N多个线程来模拟,我们马上就看到如下的提示:
1700475121
1700475122
编号:LiSi
1700475123
1700475124
考试地址:ZhangSan
1700475125
1700475126
线程不安全了!
1700475127
1700475128
看看,线程不安全了吧,这是正常的,设置的享元对象数量太少,导致每个线程都到对象池中获得对象,然后都去修改其属性,于是就出现一些不和谐数据。只要使用Java开发,线程问题是不可避免的,那我们怎么去避免这个问题呢?享元模式是让我们使用共享技术,而Java的多线程又有如此问题,该如何设计呢?没什么可以参考的标准,只有依靠经验,在需要的地方考虑一下线程安全,在大部分的场景下都不用考虑。我们在使用享元模式时,对象池中的享元对象尽量多,多到足够满足业务为止。
1700475129
[
上一页 ]
[ :1.70047508e+09 ]
[
下一页 ]