Не вызывает ли проблема Future.get какие-либо проблемы?

Строки в Java неизменяемы. Это означает, что всякий раз, когда вы пытаетесь изменить / изменить строку, вы получаете новый экземпляр. Вы не можете изменить исходную строку. Это сделано для того, чтобы эти экземпляры строк могли кэшироваться. Типичная программа содержит множество ссылок на строки и кеширование этих экземпляров, что может уменьшить объем памяти и увеличить производительность программы.

При использовании оператора == для сравнения строк вы не сравниваете содержимое строки , но фактически сравнивают адрес памяти. Если они равны, в противном случае они вернут true и false. Если значение равно в строке, сравнивает содержимое строки.

Итак, вопрос в том, что все строки кэшируются в системе, как получается == возвращает false, тогда как equals возвращает true? Ну, это возможно. Если вы создадите новую строку, например String str = new String("Testing"), вы создадите новую строку в кеше, даже если в кеше уже содержится строка с тем же содержимым. Короче говоря, "MyString" == new String("MyString") всегда будет возвращать false.

Java также говорит о функции intern (), которая может использоваться в строке, чтобы сделать ее частью кеша, поэтому "MyString" == new String("MyString").intern() вернет true.

Примечание: == оператор намного быстрее, чем равен только потому, что вы сравниваете два адреса памяти, но вы должны быть уверены, что код не создает новые экземпляры String в коде. В противном случае вы столкнетесь с ошибками.

2
задан Sun 13 July 2018 в 11:09
поделиться

2 ответа

Я выполняю определенный поток, в котором я отправляю некоторую задачу в Callable и сохраняю вывод в будущем Future<>. В некоторых случаях я не вызываю future.get(), чтобы получить значение, и я не отменю задачу. Может ли это вызвать какую-либо проблему?

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

Очевидно, что вы можете отправить Runnable вместо Callable, если вам не нужны результаты из метод call(), но он звучит для меня так же, как вы хотите программно выбрать просто забыть о Callable, который в порядке.

0
ответ дан Gray 17 August 2018 в 13:06
поделиться

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

Но обратите внимание на эту специальную функцию future.get :

Эффекты согласованности памяти. Действия, выполняемые асинхронным вычислением, происходят до действий, следующих за соответствующим Future.get () в другом потоке.

пример:

int i = 0;

, и если вы дадите

i = 1;

в задаче, затем прочитайте i после future.get, он может гарантировать, что вы получите новое значение 1.

Не вызывая future.get, вы можете получить устаревшее значение 0.

1
ответ дан Sun 17 August 2018 в 13:06
поделиться