同步相同的字符串值
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);
}
}
假设我有一个为 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);
}
}