История изменений
Исправление kovrik, (текущая версия) :
Дома проверю на macOS'и.
Я думаю, что это всё из-за шедулера.
1. JVM шедулингом не занимается, это делает ОС
2. thread.start() не означает, что тред мгновенно запустится и начнет выполнять run(). Он просто «отдает» тред шедулеру и просит его запустить. JVM не гарантирует порядок запуска.
3. join() вызывает join(0), который тупо блокирует текущий тред и ждет пока isAlive() другого треда не вернет false:
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
...
if (millis == 0) {
while (isAlive()) {
wait(0);
}
...
Вангую, что иногда тред просто не успевает стартануть (ибо шедулер; следовательно, isAlive() возвращает false; lock еще не залочен, tryLock проходит успешно) и join() выходит.
Исходная версия kovrik, :
Дома проверю на macOS'и.
Я думаю, что это всё из-за шедулера.
1. JVM шедулингом не занимается, это делает ОС
2. thread.start() не означает, что тред мгновенно запустится и начнет выполнять run(). Он просто «отдает» тред шедулеру и просит его запустить. JVM не гарантирует порядок запуска.
3. join() вызывает join(0), который тупо блокирует текущий тред и ждет пока isAlive() другого треда не вернет false:
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
...
if (millis == 0) {
while (isAlive()) {
wait(0);
}
...
Вангую, что иногда тред просто не успевает стартануть (ибо шедулер; следовательно, isAlive() возвращает false; lock еще не залочен, tryLock проходит успешно) и join() выходит.