Java 8:声纳兼容服务器套接字

下面是我的run()服务器套接字线程,它将作为Executors.newWorkStealingPool().submit(() -> mainServer.run());并接受客户端连接运行。它运行良好,但Sonar抱怨它的Bug类型Loops should not be infinite (squid:S2189)


    class MainServer {

    private final ServerSocket serverSocket;    

    private final boolean checkClientCerts;

    private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(MainServer.class.getName());

    private final int threadPoolSize;

    private boolean running;

    private ExecutorService executorService;    


 MainServer(int port, boolean checkClientCerts, int threadPoolSize, InetAddress bindAddress) throws IOException {


        LOG.debug("Locating server socket factory for SSL...");

        SSLServerSocketFactory factory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();

        LOG.debug("Creating a server socket on port " + port);

        SSLServerSocket serverSocket = (SSLServerSocket) factory.createServerSocket(port, 0, bindAddress);        

        this.checkClientCerts = checkClientCerts;

        this.threadPoolSize = threadPoolSize;

    }


    void run() {

        running = true;

        DefaultThreadFactory threadFactory = new DefaultThreadFactory("SSLHandshake");

        executorService = new ShutdownThreadPoolExecutor(threadPoolSize,threadFactory);


        while (running) {

            Socket clientSocket;


            try {

                clientSocket = serverSocket.accept();

                MainServerHandshakeThread handshakeThread = new MainServerHandshakeThread(clientSocket, this);                

                executorService.submit(handshakeThread);


            } catch (IOException ex) {

                LOG.error("Error accepting connection",ex);

            }


        }

    }


    public void shutdown() {

        LOG.info("Stopping main server...");

        running = false;

        try {

            if (serverSocket!=null) {

                serverSocket.close();

            }

        } catch(IOException ex) {

            LOG.debug("Failed to close socket",ex);

        }


有人可以帮助我如何优化上述代码块以消除声纳投诉吗?


慕尼黑8549860
浏览 71回答 1
1回答

Qyouu

将您标记running为volatile.volatile将变量标记为可由其他线程更改1。这意味着优化器(或代码分析器,如 SonarQube)不能假设其他线程不修改此类变量。在您的示例中,这两个都可以假设never Changes,从而将您的代码标记为具有无限循环。volatile如果变量可以被其他线程访问和修改,则应该将变量标记为。1由用户207421更正。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java