Java 具有相同值的字符串文字不';不要在控制器中保持同步锁定
我知道字符串文字指向同一个对象,并且对相同的值具有相同的引用。因此,它正好适合我的同步情况。我测试了下面的代码,它正是我想要的。我希望在相同的字符串上有一个锁,而在字符串不同时没有锁Java 具有相同值的字符串文字不';不要在控制器中保持同步锁定,java,string,spring-boot,controller,synchronized,Java,String,Spring Boot,Controller,Synchronized,我知道字符串文字指向同一个对象,并且对相同的值具有相同的引用。因此,它正好适合我的同步情况。我测试了下面的代码,它正是我想要的。我希望在相同的字符串上有一个锁,而在字符串不同时没有锁 public class SampleThread extends Thread { String lock; public SampleThread(String s) { this.lock = s; } @Override public void run() { long id = this
public class SampleThread extends Thread {
String lock;
public SampleThread(String s) {
this.lock = s;
}
@Override
public void run() {
long id = this.getId();
synchronized (lock) {
for (int i = 0; i < 1000; i++) {
System.out.println("thread with id: "+id);
}
}
}
public static void main(String[] args) {
SampleThread s1 = new SampleThread("mina");
SampleThread s2 = new SampleThread("mina");
s1.start();
s2.start();
}
}
编译器将优化相同值的字符串,并使它们成为代码的一部分时完全相同的实例,如中所示:
if ("abc" == "abc")
但是,如果字符串是在运行时创建的,就像在您的例子中一样,字符串测试是从URL解析的,那么它不会以相同的方式进行优化,它是它自己的实例
因此,执行两次将创建两个单独的字符串实例,它们不会比较==这意味着在其上进行同步将不会得到预期的结果
似乎您正试图使相同“测试”值的处理同步,但允许不同的测试值异步处理。如果是这种情况,那么您可以做一些事情,比如保留正在处理的值的映射,其中“test”值是键,对象的实例存储为用作互斥对象的值。然后在查找互斥对象后在互斥对象上进行同步。字符串文本指向同一对象。是什么让你认为
test
是一种文字?^同时,围绕字符串文字进行同步似乎是一种让代码更难理解和调试的神奇方式。字符串不是不可变的吗?为什么您需要同步它呢?无论出于什么原因,除非你在处理变量,否则它是无法更改的。这只是我想要实现的业务的一部分。我知道字符串线程的安全性,但我使用这个锁在我的对象的特定字段上实现同步。这只是一个示例。谢谢,我不知道运行时创建案例。这是一个很好的提示。map可能会占用我很多空间,我必须使用一些缓存系统来管理这些空间。这就是我决定使用字符串的原因。但是你给我的关于实习生的警告可能也很危险。多谢各位
if ("abc" == "abc")