인터넷에서 많은 기사는 멀티 스레드에서 String.intern()
을 사용하는 것이 좋지 않다고 지정하지만 실제로 왜 나쁜가를 이해할 수 없었습니다. String.intern()
을 사용하면 항상 문자열 풀에서 고유 한 문자열을 반환하지 않습니까? 그렇지 않은 경우 JVM 문자열 풀 스레드가 로컬입니까? 그렇지 않다면 다중 스레드 환경에서 동기화하기 위해 String.intern()
을 사용하는 것이 나쁜 것으로 간주되는 이유는 무엇입니까? 나는 id.I 하나의 트랜잭션으로 모든 방법을 실행하려는 하나의 공통 문자열을 기반으로 방법 모두를 동기화하고JVM 문자열 풀 스레드가 로컬입니까? 이 유스 케이스에 문제가 발생합니까?
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
}
}
}
(다른 방법을 방지 : 그래서 다음 사용하는 경우, 그것은 동기화 문제가 해결되지 것입니다 심지어 데이터베이스를 읽습니다.)하지만 데이터베이스 수준에서이 작업을 수행하면 교착 상태가 발생합니다 (읽기 액세스를 방해하지 않음). 이 경우 string intern을 사용하여 동기화하는 데 병목 현상 또는 교착 상태 문제가 있습니까? 이 문제를 해결하기위한 다른 방법이 있습니까? 불편을 끼쳐 드려 죄송합니다.
synchronized를위한 String을 사용하는 것이 나쁘지 않은 경우 다음을 수행 할 수 있습니다. P https://vanilla-java.github.io/2016/04/21/Bad-String.html –
분명히 [xy 문제] (http://meta.stackexchange.com/a/66378/166789). 단일 글로벌 데이터베이스 잠금이 정상적인 상황에서 교착 상태를 일으킬 수있는 방법은 불가능합니다. 교착 상태에 대해 적어도 두 개의 잠금이 있어야하며 잠금 객체로 인디 언트 문자열을 사용하면 소프트웨어의 논리 오류가 해결되지 않습니다. – Holger
답변 해 주셔서 감사 드리며 불편을 끼쳐 드려 죄송합니다. 나는 정말로 xy 문제에 대해 알지 못했지만 제안 된 해결책과 같은 문제에 대한 다른 접근법에 대한 전문가의 의견을 구하지 않고있다. –