2016-09-02 14 views
0

Многие статьи в Интернете указывают, что использование String.intern() в многопоточной обработке плохо, но я действительно не мог понять, почему это плохо. Использование String.intern() всегда возвращает уникальную строку из пула строк, не так ли? Если это не так, то Является ли JVM string pool thread local? Если нет, то почему использование String.intern() для синхронизации в многопоточной среде считается плохим? Таким образом, в следующем случае использования, не будет ли он решить проблему синхронизации:Является ли JVM string pool thread local? Будет ли это причиной каких-либо проблем с этим вариантом использования?

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.I требуется выполнить весь метод в качестве одной транзакции (предотвращающий другой метод даже прочитать базу данных). Но делать это на уровне базы данных вызывает тупик (не препятствуя доступу чтения). Синхронизация с использованием string intern в этом случае имеет проблемы с узким местом или тупиком? Есть ли другой подход к решению проблемы? простите меня за любые неудобства или плохое форматирование.

+0

Если вы используете 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

Нет, интернированные строки доступны в глобальном масштабе в JVM.

Как говорится в this answer:

синхронизации на стажера строки на самом деле очень плохая идея - отчасти потому, что создание Intern строк допускается, чтобы заставить их существовать в бессрочном ...

т.е. вы можете создать постоянно растущее количество блокировок.

... и отчасти потому, что если более чем один бит кода в любой точке вашей программы синхронизируется на внутренних строках, у вас есть зависимости между этими битами кода и предотвращение взаимоблокировок или других ошибок.

Эти строки видны на всей территории JVM, поэтому все, что угодно, где угодно можно попытаться синхронизировать в одной строке, что может привести к труднопроизносимым и труднодоступным проблемам.

 Смежные вопросы

  • Нет связанных вопросов^_^