インターネット上の多くの記事はString.intern()
、マルチスレッドでの使用が悪いことを示していますが、なぜそれが悪いのか本当に理解できませんでした。使用するとString.intern()
、常に文字列プールから一意の文字列が返されますね。そうでない場合は、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
}
}
}
ここでは、1 つの共通の文字列 ID に基づいて両方のメソッドを同期しています。メソッド全体を 1 つのトランザクションとして実行したい (他のメソッドがデータベースを読み取れないようにする)。しかし、データベース レベルでこれを行うと、デッドロックが発生します (読み取りアクセスを妨げない)。この場合、string intern を使用して同期すると、ボトルネックやデッドロックの問題が発生しますか? 問題を解決するための他のアプローチはありますか? ご不便やフォーマットの悪さをお許しください。