Так как volatile write и volatile read находятся в отношении happens-before, поток, читающий значение, увидит все действия, которые делал поток, вызвавший rebuild(), до volatile write. То есть внутри одного потока все операции находятся в отношении happens-before, а так как это отношение транзитивно, то другие потоки увидят уже правильное значение переменной.