模板引擎单例模式线程安全疑问

Engine forEmail = Engine.create("forEmail");
Template template = Engine.use("forEmail").getTemplate("email-template.txt");

即是forEmail用单例,还是template单例。template对象是线程安全的吗?

template.renderToString(...);

上面代码并发时线程安全的吗?


评论区

JFinal

2019-09-10 17:50

Template 是线程安全的,所以在 enjoy 内部 Template 对象是被缓存的,被缓存可确保模板只被解析一次,后面可以无数次去使用

确保线程安全的主要措施就是:将不是线程安全的参数通过 render 方法参数传递进去,例如:
Template.render(Map data, Writer writer);

上面的 data、writer 参数线程不安全,所以让其通过 render 方法传入,确保了非线程安全参数与 Template 对象的分离,从而确保了 Template 可以采用线程安全设计并缓存,从而可以极大提升效率

perlin

2019-09-11 08:42

@JFinal 好的,谢谢。这样就用这放心了。