知识卡片

原型模式用对象复制替代new解决并发共享冲突

普通读书笔记卡 · 1852.b

内容

电子账单批量发送场景多线程共享同一Mail对象,会导致收件人信息被覆盖,线程不安全。原型 模式解法是让Mail实现Cloneable并覆写clone(),每个线程各自clone()得到独立副本再设置 细节——这种”不用new而是通过对象复制产生对象”的模式就是原型模式。发散:当”多个使用者 共享初始状态但各自要独立修改细节”时,用复制隔离状态比用锁保护共享状态更简单。

参考来源

- 位置:《设计模式之禅(第2版)》第13章《原型模式》(源文件:_epub-src/text/part0057.html) - 结论依据:原文分析多线程共享同一个Mail对象会导致收件人信息被覆盖的线程安全问题,随后让Mail实现Cloneable并在每次循环中调用mail.clone()产生独立副本再分别设置细节,说明"这种不通过new关键字来产生一个对象,而是通过对象复制来实现的模式就叫做原型模式"。 - 原始内容:产生第一封邮件对象,放到线程1中运行,还没有发送出去;线程2也启动了,直接就把邮件对象mail的收件人地址和称谓修改掉了,线程不安全了……这种不通过new关键字来产生一个对象,而是通过对象复制来实现的模式就叫做原型模式。