Параллелизм Java на практике Листинг 6.2

Следующий фрагмент кода приведен в листинге 6.2 "Практический параллелизм Java" ( 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 ответ

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

Как указывает JLS:

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

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

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

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

Другие вопросы по тегам