gpt4 book ai didi

Java 8 : Sonar compliant Server Socket

转载 作者:行者123 更新时间:2023-11-30 05:27:09 28 4
gpt4 key购买 nike

下面是我的服务器套接字线程的run(),它将作为Executors.newWorkStealingPool().submit(() -> mainServer.run());运行code> 并接受客户端连接。它运行良好,但Sonar提示它是Bug类型的循环不应该是无限的(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);
}

executorService.shutdown();
try {
if (!executorService.awaitTermination(500, TimeUnit.MILLISECONDS)) {
executorService.shutdownNow();
}
} catch (InterruptedException e) {
executorService.shutdownNow();
}
LOG.info("Main server stopped...");
}
}

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

最佳答案

将您的正在运行标记为 volatile

volatile 将变量可见标记为可被其他线程更改1。这意味着优化器(或代码分析器,如 SonarQube)不能假设其他线程修改此类变量。在您的示例中,这两个都可以假设正在运行永远不会改变,从而将您的代码标记为具有无限循环。类似的例子可以找到in this answer .

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

<小时/>

1user207421更正。

关于Java 8 : Sonar compliant Server Socket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58311200/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com