Java并发性实践清单6.2

Java并发性实践清单6.2,java,concurrency,final,safe-publication,Java,Concurrency,Final,Safe Publication,下面的代码片段来自Java并发实践()中的清单6.2 package net.jcip.examples; 导入java.io.IOException; 导入java.net.ServerSocket; 导入java.net.Socket; /** *ThreadPertaskWeb服务器 * *为每个请求启动新线程的Web服务器 * *@作者Brian Goetz和Tim Peierls */ 公共类ThreadPerTaskWebServer{ 公共静态void main(字符串[]args

下面的代码片段来自Java并发实践()中的清单6.2

package net.jcip.examples;
导入java.io.IOException;
导入java.net.ServerSocket;
导入java.net.Socket;
/**
*ThreadPertaskWeb服务器
*

*为每个请求启动新线程的Web服务器 * *@作者Brian Goetz和Tim Peierls */ 公共类ThreadPerTaskWebServer{ 公共静态void main(字符串[]args)引发IOException{ ServerSocket=新的ServerSocket(80); while(true){ 最终套接字连接=Socket.accept(); Runnable任务=新的Runnable(){ 公开募捐{ HandlerRequest(连接); } }; 新线程(任务).start(); } } 专用静态无效句柄请求(套接字连接){ //这里的请求处理逻辑 } }

在这本书中,
final
关键字被加粗,似乎是为了突出它的重要性。在前面的章节中(特别是第3章),
final
讨论了线程安全发布。然而,在这个例子中,
final
关键字似乎出于不同的原因很重要,主要是因为Java的“闭包”行为-


我说的
final
关键字纯粹是为了这个目的,而安全发布与它在这里的用法无关,对吗?

你说得对。从Java8开始,您也可以省略
final
,因为Java8有“effectivefinal”的概念,如果您在初始化后不修改变量,则该概念适用

作为:

对线程的
start()
调用发生在线程中的任何操作之前 启动线程

一般来说,关于发生在恋爱之前的事情,它说:

两个动作可以由“发生在之前”关系排序。如果有 动作发生在另一个动作之前,然后第一个动作对和可见 在第二天之前订购

调用
start()
之前发生的任何事情都保证在
Runnable
任务中可见

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
    }
}