实践清单6.2中的Java并发

时间:2018-05-28 01:13:21

标签: java concurrency final safe-publication

以下代码片段来自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关键字纯粹是出于此目的,而安全发布与此处的使用无关?

1 个答案:

答案 0 :(得分:1)

你是对的。从Java 8开始,您也可以省略final,因为Java 8具有&#34;有效最终&#34;的概念。如果在初始化后没有修改变量,则适用。

作为the JLS specifies

  

在线程中发生对start()的调用 - 在任何操作之前发生   开始了。

一般来说,关系发生在关系之前,它说:

  

可以通过先发生关系来排序两个动作。如果一个   行动发生在另一个之前,然后第一个是可见的和   在第二天之前订购。

start()任务中保证可以看到Runnable来电之前发生的任何事情。