У нас было приложение, которое использовало сломанную идиому двойной проверки, и оно функционировало очень долго - нет, на самом деле у меня никогда не возникало проблем с этой идиомой.Конечно, я исправил это независимо от этого.
Я предполагаю, что одна из причин этого заключается в том, что видимость потоков в конечном итоге будет достигнута в реальном мире.И как только оно достигнуто, оно остается.Так что да, будет очень трудно определить, возникла ли проблема.
Я полагаю, что реализация hashCode()
String
частично опирается на этот факт ... Потоки вычисляют hashCode, пока они не видяткеш, но со временем они начинают видеть.Между тем, повторяющиеся вычисления означают лишь некоторое потраченное впустую ЦП времени, а преимущество, связанное с отсутствием эффекта энергозависимой семантики в памяти, превосходит эти напрасные усилия (по крайней мере, поэтому они реализовали его таким образом, как я полагаю).Идиома, которая имеет правильное использование: (фактическая реализация String.hashCode ()):
/** Cache the hash code for the string */
private int hash; // Defaults to 0
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
Очевидно, что прежде чем использовать его, нужно много подумать и измерить.