以下代码片段来自Java Concurrency in Practice(http://jcip.net/listings/ThreadPerTaskWebServer.java)中的6.2列表
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&#34; closure&#34;行为 - Why are only final variables accessible in anonymous class?
我是否正确final
关键字纯粹是出于此目的,而安全发布与此处的使用无关?
答案 0 :(得分:1)
你是对的。从Java 8开始,您也可以省略final
,因为Java 8具有&#34;有效最终&#34;的概念。如果在初始化后没有修改变量,则适用。
在线程中发生对
start()
的调用 - 在任何操作之前发生 开始了。
一般来说,关系发生在关系之前,它说:
可以通过先发生关系来排序两个动作。如果一个 行动发生在另一个之前,然后第一个是可见的和 在第二天之前订购。
在start()
任务中保证可以看到Runnable
来电之前发生的任何事情。