Параллелизм Java на практике Листинг 6.2 - PullRequest
0 голосов
/ 28 мая 2018

Следующий фрагмент кода взят из листинга 6.2 в Java Concurrency on Practice (http://jcip.net/listings/ThreadPerTaskWebServer.java)

package net.jcip.examples;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * ThreadPerTaskWebServer
 * <p/>
 * Web server that starts a new thread for each request
 *
 * @author Brian Goetz and Tim Peierls
 */
public class ThreadPerTaskWebServer {
    public static void main(String[] args) throws IOException {
        ServerSocket socket = new ServerSocket(80);
        while (true) {
            final Socket connection = socket.accept();
            Runnable task = new Runnable() {
                public void run() {
                    handleRequest(connection);
                }
            };
            new Thread(task).start();
        }
    }

    private static void handleRequest(Socket connection) {
        // request-handling logic here
    }
}

. В книге ключевое слово final выделено жирным шрифтом, как будто оно подчеркивает его важность. В предыдущемВ главах (особенно в главе 3) обсуждается final в отношении поточно-ориентированной публикации, однако в этом примере ключевое слово final кажется важным по разным причинам, в основном из-за поведения "закрытия" Java - Почему в анонимном классе доступны только конечные переменные?

Прав ли я, что ключевое слово final предназначено исключительно для этой цели, и безопасная публикация не имеет ничего общего с его использованием здесь?

1 Ответ

0 голосов
/ 28 мая 2018

Вы правы.И начиная с Java 8, вы также можете не указывать final, поскольку в Java 8 реализована концепция «эффективно финальной», которая применяется, если вы не изменяете переменную после инициализации.

Как JLS определяет :

Вызов start() в потоке происходит до любых действий в запущенном потоке.

И, как правило, о том, что происходит доотношения, это говорит:

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

Все, что произошло до вызова start(), гарантированно будет видно внутри вашей задачи Runnable.

...