同步相同的字符串值

Synchronize On Same String Value

假设我有一个为 Web 应用程序创建新用户的方法。该方法本身调用一个静态助手 class,它创建一个 SQL 语句来执行实际插入到我的数据库中。

public void createUserInDb(String userName){
    SQLHelper.insertUser(userName);
}

我想同步此方法,使其不能被不同的线程同时调用如果传入的参数 (userName) 在这些线程上相同。我知道我可以使用 synchronized 关键字同步方法执行,但这通常会阻止不同的线程同时执行该方法。如果传入的变量相同,我只想防止并发执行。 Java 中是否有一个简单的结构可以让我这样做?

无法保证具有相同值的两个字符串会指向 Java 中的同一实例,尤其是如果它们是根据用户输入创建的。

但是,您可以使用 intern() 方法轻松地将它们强制放入字符串池中,这将保证使用的是同一个实例:

public void createUserInDb(String userName){
    String interned = userName.intern();
    synchronized (interned) {
        SQLHelper.insertUser(interned);
    }
}