JVM 字符串池线程是本地的吗?它会导致此用例出现任何问题吗?
Is JVM string pool thread local? Will it cause any issue with this use case?
网上很多文章都指出在多线程中使用String.intern()
是不好的,但我真的不明白为什么它bad.Using String.intern()
总是return一个唯一的字符串来自字符串池,不是吗?
如果不是这样,那么 JVM 字符串池线程是本地的吗? 如果不是,那么为什么在多线程环境中使用 String.intern()
进行同步被认为是不好的?那么在下面的用例中,不就解决了同步问题吗:
Method1 {
synchronized(Interned string) {
select method {
select query to databse
}
...some processing...
update method {
update query to database
}
}
}
Method2 {
synchronized(Interned string) {
select method {
select query to databse
}
.....some processing....
insert method {
insert query to database
}
}
}
这里我基于一个公共字符串同步两个方法id.I想将整个方法作为一个事务执行(防止其他方法甚至读取数据库)。但是在数据库级别这样做会导致死锁(不阻止读取访问)。在这种情况下使用字符串实习生进行同步是否存在瓶颈或死锁问题?还有其他方法可以解决这个问题吗?
请原谅我造成的任何不便或格式错误。
不,驻留字符串在 JVM 中全局可用。
正如this answer中所说:
synchronizing on intern strings is actually a really bad idea - partly because creating intern strings is permitted to cause them to exist in perpetuity ...
即您可能会创建越来越多的锁。
... and partly because if more than one bit of code anywhere in your program synchronizes on intern strings, you have dependencies between those bits of code, and preventing deadlocks or other bugs may be impossible.
字符串在整个 JVM 中都是可见的,因此任何地方的任何东西都可以尝试在同一个字符串上同步,从而导致难以重现、难以修复的问题。
网上很多文章都指出在多线程中使用String.intern()
是不好的,但我真的不明白为什么它bad.Using String.intern()
总是return一个唯一的字符串来自字符串池,不是吗?
如果不是这样,那么 JVM 字符串池线程是本地的吗? 如果不是,那么为什么在多线程环境中使用 String.intern()
进行同步被认为是不好的?那么在下面的用例中,不就解决了同步问题吗:
Method1 {
synchronized(Interned string) {
select method {
select query to databse
}
...some processing...
update method {
update query to database
}
}
}
Method2 {
synchronized(Interned string) {
select method {
select query to databse
}
.....some processing....
insert method {
insert query to database
}
}
}
这里我基于一个公共字符串同步两个方法id.I想将整个方法作为一个事务执行(防止其他方法甚至读取数据库)。但是在数据库级别这样做会导致死锁(不阻止读取访问)。在这种情况下使用字符串实习生进行同步是否存在瓶颈或死锁问题?还有其他方法可以解决这个问题吗? 请原谅我造成的任何不便或格式错误。
不,驻留字符串在 JVM 中全局可用。
正如this answer中所说:
synchronizing on intern strings is actually a really bad idea - partly because creating intern strings is permitted to cause them to exist in perpetuity ...
即您可能会创建越来越多的锁。
... and partly because if more than one bit of code anywhere in your program synchronizes on intern strings, you have dependencies between those bits of code, and preventing deadlocks or other bugs may be impossible.
字符串在整个 JVM 中都是可见的,因此任何地方的任何东西都可以尝试在同一个字符串上同步,从而导致难以重现、难以修复的问题。