0

インターネット上の多くの記事は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 を使用して同期すると、ボトルネックやデッドロックの問題が発生しますか? 問題を解決するための他のアプローチはありますか? ご不便やフォーマットの悪さをお許しください。

4

1 に答える 1

1

いいえ、インターンされた文字列は JVM でグローバルに利用できます。

この回答で言うように:

インターン文字列で同期することは、実際には本当に悪い考えです-インターン文字列を作成すると、それらが永続的に存在することが許可されているためです...

つまり、ますます多くのロックを作成する可能性があります。

...そして部分的には、プログラム内のどこかに複数のコードがインターン文字列で同期する場合、それらのコード間に依存関係があり、デッドロックやその他のバグを防ぐことが不可能になる可能性があるためです。

文字列は JVM 全体で表示されるため、どこでも同じ文字列で同期を試みることができ、再現や修正が困難な問題が発生します。

于 2016-09-02T09:57:18.167 に答える