为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑8549860 2023-10-12 16:50:26
下面是我的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);        }有人可以帮助我如何优化上述代码块以消除声纳投诉吗?
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

将您标记runningvolatile.

volatile将变量标记为可由其他线程更改1。这意味着优化器(或代码分析器,如 SonarQube)不能假设其他线程修改此类变量。在您的示例中,这两个都可以假设never Changes,从而将您的代码标记为具有无限循环。

volatile如果变量可以被其他线程访问和修改,则应该将变量标记为。


1由用户207421更正。



查看完整回答
反对 回复 2023-10-12
  • 1 回答
  • 0 关注
  • 64 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信