鉴于这种代码从一个DAO实例方法称为:
jdbcTemplate.query(qry, new Object[]("abc"), new BeanPropertyRowMapper<dto>(dto.class))
(其中的JdbcTemplate是由Spring注入的DAO的一个实例成员,和DAO是一个具有单例作用域的Spring管理bean),那么这看起来没问题。 BeanPropertyRowMapper是有状态的,如果多线程同时使用,将不会是线程安全的,但是您不会将它公开给多线程,而是以线程受限的方式使用它,这是安全的。
爪哇并发实践,第3.3节,从总体上讨论线程禁闭:
访问共享,可变数据要求使用同步;避免这种要求的一种方法是不分享。如果仅从单个线程访问数据,则不需要同步。这种技术,即线程限制,是实现线程安全的最简单方法之一。当一个对象被限制在一个线程中时,即使被限制的对象本身不是[CPJ 2.3.2],这种用法也是线程安全的。
它还讨论(3.3.2)的特定类型的线程限制的,你正在做的:
堆栈限制是线程限制的特殊情况,其中一个对象只能是通过局部变量达到。正如封装可以更容易地保存不变量一样,局部变量可以更容易地将对象限制在线程中。局部变量本质上局限于正在执行的线程;它们存在于执行线程的堆栈上,而其他线程无法访问它。堆栈限制(也称为线程内或线程本地使用,但不要与ThreadLocal库类混淆)比专用线程限制更容易维护并且不易受到脆弱性限制。
RowMapper的唯一引用位于为该方法调用创建的堆栈帧上。没有其他线程(包括在同一个DAO上调用相同方法的线程)可以访问它。告诉你的客户这个对象由于只能通过局部变量到达而已经是安全的,并且把他引用到JCIP书中的引用段落,这是一个权威的参考。
显示你究竟是如何使用它。如果您正在查询方法中创建行映射器的新实例,那么线程安全问题应该不存在可能性。 –
JdbcTemplate.query(qry,new Object [](“abc”),new BeanPropertyRowMapper(dto.class))。请给出解释 –
这是jdbcTemplate对于错误感到抱歉并且被注入 –