LINUX.ORG.RU

История изменений

Исправление 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() выходит.