打字猴:1.70047508e+09
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 ]  [ 下一页 ]