Получи случайную криптовалюту за регистрацию!

Java Interview Tasks

Логотип телеграм канала @java_interview_tasks — Java Interview Tasks J
Логотип телеграм канала @java_interview_tasks — Java Interview Tasks
Адрес канала: @java_interview_tasks
Категории: Блоги
Язык: Русский
Количество подписчиков: 2.70K
Описание канала:

Реальные вопросы и задачи с собеседований.
Оригинальный авторский контент.
Актуальный материал.
Уровень вопросов от junior до supersenior.
Автор канала - @alexzelentsov
По рекламе обращайтесь: @alexzelentsov , @Vatrusha_ksu

Рейтинги и Отзывы

3.67

3 отзыва

Оценить канал java_interview_tasks и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

1

4 звезд

0

3 звезд

2

2 звезд

0

1 звезд

0


Последние сообщения

2022-08-19 13:07:05 Правильный вариант: может быть и true и false

Дело в том, что вызов thenRun у того же future, но во втором потоке, может привести к срабатыванию callback в первом thenRun.
При этом callback первого thenRun будет вызван во втором потоке.

Это происходит в тот момент, когда future.complete(null) начало выполняться, но ещё не успело вызвать callbacks,
а во втором потоке вызвался thenRun, который и выполнит все остальные callbacks на этом future но уже в своём потоке.

Проблем решается просто:

//основной поток
Thread mainThread = Thread.currentThread();

//создаём второй поток
Executor executor = Executors.newSingleThreadExecutor();

CompletableFuture future = new CompletableFuture<>();
CompletableFuture secondThreadFuture = future.thenRun(() -> {
System.out.println(Thread.currentThread() == mainThread);
});

//просто добавляем callback к тому же future в другом потоке
executor.execute(() -> {
secondThreadFuture.thenRun(() -> {
//nop
});
});

//завершаем future
future.complete(null);

Мы просто добавили secondThreadFuture, которая зависит от результата исходной future.
И вызов на ней thenRun во втором потоке не приводит к возможному срабатыванию callbacks на исходной future.

Для гарантированного вызова callbacks в заданных пользователем потоках у CompletableFuture существуют async реализации методов,
например — thenRunAsync, которым нужно передавать Executor. Но async-версии методов могут работать медленней, чем обычные.
1.2K viewsAlexander Zelentsov, 10:07
Открыть/Комментировать
2022-08-12 12:24:17 Задача с собеседования:
Sort a large input stream of 3-byte unsigned integers (e.g. 16GB total size) not using disk provided you run 32-bit Java

Ваши варианты пишите в комментарии
2.1K viewsAlexander Zelentsov, edited  09:24
Открыть/Комментировать
2022-08-03 16:30:29
Что будет напечатано?
Anonymous Quiz
12%
true
18%
false
22%
может ничего не напечататься
19%
может и true и false
29%
узнать ответ
512 voters3.1K viewsAlexander Zelentsov, 13:30
Открыть/Комментировать
2022-08-03 16:29:28
Что будет напечатано?
2.6K viewsAlexander Zelentsov, 13:29
Открыть/Комментировать
2022-08-01 13:09:28 Ответ:
тут нарушен порядок HB сначала идет запись в volatile поле g а потом в x, поэтому чтение из g еденицы не дает гарантий относительно x.
Поэтому возможны все варианты: "0, 0", "1, 1", "0, 1", "1, 0"

Пример использования конструкции с правильным HB тут - https://t.me/java_interview_tasks/53
2.7K viewsAlexander Zelentsov, edited  10:09
Открыть/Комментировать
2022-07-27 12:40:15
Какие значения могут напечататься? (thread1 и thread2 запускаются одновременно в разных потоках)
Anonymous Quiz
10%
"0, 0", "1, 1"
13%
"0, 0", "1, 1", "1, 0"
9%
"0, 0", "1, 1", "0, 1"
45%
"0, 0", "1, 1", "0, 1", "1, 0"
23%
узнать ответ
576 voters3.0K viewsAlexander Zelentsov, 09:40
Открыть/Комментировать
2022-07-27 12:39:07
Какие значения могут напечататься? (thread1 и thread2 запускаются одновременно в разных потоках)
2.5K viewsAlexander Zelentsov, 09:39
Открыть/Комментировать
2022-07-22 17:56:09 Старый видос, но актуальный



2.9K viewsAlexander Zelentsov, edited  14:56
Открыть/Комментировать
2022-07-21 12:13:32 @BenchmarkMode(Mode.Throughput)
@Fork(1)
@State(Scope.Thread)
@Warmup(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
public class SystemCalls {

@Benchmark
public long curr() {
return System.currentTimeMillis();
}

@Benchmark
public long instant() {
return Instant.now().toEpochMilli();
}
}
2.4K viewsAlexander Zelentsov, 09:13
Открыть/Комментировать
2022-07-21 12:13:12 Ответ на вопрос про currentTimeMillis и toEpochMilli:

Тут очевидно, что гораздо быстрее (1) так как:
1) @IntrinsicCandidate public static native long currentTimeMillis(); - IntrinsicCandidate
(Про интринсики я писал в прошлом посте - https://t.me/java_interview_tasks/167)
2) (2) создает объект Instant.now() и далее вызывается метод .toEpochMilli(), который выполянет конвертацию -> больше операций + оверхед по памяти

Результаты у меня получились такие:
VM version: JDK 17.0.1, OpenJDK 64-Bit Server VM, 17.0.1+12-39
Units: ops/s
Benchmark Score Error
currentTimeMillis 205488100,839 ± 5397269,355
toEpochMilli 65060918,825 ± 3064529,122

Код бенчмарка ниже:
2.1K viewsAlexander Zelentsov, 09:13
Открыть/Комментировать