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  
  }  
 }       
}

在这里,我基于一个公共字符串 id 同步这两种方法。我想将整个方法作为一个事务执行(防止其他方法甚至读取数据库)。但是在数据库级别执行此操作会导致死锁(不会阻止读取访问)。在这种情况下使用字符串实习生进行同步是否存在瓶颈或死锁问题?有没有其他方法可以解决这个问题?如有任何不便或格式错误,请原谅我。

4

1 回答 1

1

不,在 JVM 中可以全局使用实习字符串。

正如它在这个答案中所说:

在实习生字符串上同步实际上是一个非常糟糕的主意 - 部分原因是允许创建实习生字符串导致它们永久存在......

即,您可能会创建越来越多的锁。

...部分是因为如果您的程序中任何位置的不止一位代码在实习生字符串上同步,那么您在这些代码位之间存在依赖关系,并且可能无法防止死锁或其他错误。

这些字符串在整个 JVM 中都是可见的,因此任何地方都可以尝试在同一个字符串上进行同步,从而导致难以重现、难以修复的问题。

于 2016-09-02T09:57:18.167 回答