单例方法应该同步吗?

Should the singleton methods be synchronized?

我的网络应用程序(这里没有 Spring-MVC,只有核心 IOC)使用了很多原型 bean,其中大部分都使用了单例 dao-bean。是否应该同步单例 dao-bean 方法,因为许多不同的原型 bean(来自不同的请求)可能在同一时刻使用相同的方法 id dao?

比如dao方法

public void setLetterNotNew(int letterId) {

    final String sql = "UPDATE income SET isnew=? WHERE id=?";

    try( Connection con = HikariFactory.getConnection(); PreparedStatement ps = con.prepareStatement(sql); ) {

        ps.setInt(1, 0);
        ps.setInt(2, letterId);

        int i = ps.executeUpdate();
        if(i==0) throw new SQLException("setLetterNotNew");

    } catch (SQLException e) {
        log.error(e);
    }
}

视情况而定。

正如您在评论中所写,您使用 jdbc。 JDBC API are synchronized and do auto-commit by default 上的所有操作。因此,如果您共享 JDBC 连接,但您的方法不需要事务(例如,它不需要更新几行之前选择的数据),则不需要同步。

但是,如果您需要事务,则必须同步此方法或为每个线程提供自己的 JDBC 连接,如 each connection is also a transaction. To achieve that you could open new connection each time in a method or let Spring handle that problem