0

인터넷에서 많은 기사는 멀티 스레드에서 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을 사용하여 동기화하는 데 병목 현상 또는 교착 상태 문제가 있습니까? 이 문제를 해결하기위한 다른 방법이 있습니까? 불편을 끼쳐 드려 죄송합니다.

+0

synchronized를위한 String을 사용하는 것이 나쁘지 않은 경우 다음을 수행 할 수 있습니다. P https://vanilla-java.github.io/2016/04/21/Bad-String.html –

+0

분명히 [xy 문제] (http://meta.stackexchange.com/a/66378/166789). 단일 글로벌 데이터베이스 잠금이 정상적인 상황에서 교착 상태를 일으킬 수있는 방법은 불가능합니다. 교착 상태에 대해 적어도 두 개의 잠금이 있어야하며 잠금 객체로 인디 언트 문자열을 사용하면 소프트웨어의 논리 오류가 해결되지 않습니다. – Holger

+0

답변 해 주셔서 감사 드리며 불편을 끼쳐 드려 죄송합니다. 나는 정말로 xy 문제에 대해 알지 못했지만 제안 된 해결책과 같은 문제에 대한 다른 접근법에 대한 전문가의 의견을 구하지 않고있다. –

답변

1

아니요, interned 문자열은 JVM에서 전역 적으로 사용할 수 있습니다.

this answer에서 말하기를 : 인턴 문자열에

동기화 실제로 정말 나쁜 생각입니다 - 인턴 문자열을 생성하는 것은 영구적으로 존재하게하는 원인이 허용된다 부분적으로 있기 때문에 ...

즉, 계속 증가하는 잠금 장치를 만들 수 있습니다.

... 코드의 하나 이상의 비트가 어디 프로그램에서 인턴 문자열을 동기화하는 경우 부분적으로 있기 때문에, 당신은 코드의 그 비트 사이의 의존성을 가지고 있고, 교착 상태 또는 다른 버그를 방지하는 것이 불가능할 수있다.

문자열은 JVM 전체에서 볼 수 있으므로 어디서나 동일한 문자열에서 동기화를 시도 할 수 있으므로 재생하기 어렵고 수정하기 어려운 문제가 발생합니다.