Параллелизм 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
задача.