SonarSource Rules
  • Products

    In-IDE

    Code Quality and Security in your IDE with SonarQube Ide

    IDE extension that lets you fix coding issues before they exist!

    Discover SonarQube for IDE

    SaaS

    Code Quality and Security in the cloud with SonarQube Cloud

    Setup is effortless and analysis is automatic for most languages

    Discover SonarQube Cloud

    Self-Hosted

    Code Quality and Security Self-Hosted with SonarQube Server

    Fast, accurate analysis; enterprise scalability

    Discover SonarQube Server
  • SecretsSecrets
  • ABAPABAP
  • AnsibleAnsible
  • ApexApex
  • AzureResourceManagerAzureResourceManager
  • CC
  • C#C#
  • C++C++
  • CloudFormationCloudFormation
  • COBOLCOBOL
  • CSSCSS
  • DartDart
  • DockerDocker
  • FlexFlex
  • GitHub ActionsGitHub Actions
  • GoGo
  • HTMLHTML
  • JavaJava
  • JavaScriptJavaScript
  • JSONJSON
  • JCLJCL
  • KotlinKotlin
  • KubernetesKubernetes
  • Objective CObjective C
  • PHPPHP
  • PL/IPL/I
  • PL/SQLPL/SQL
  • PythonPython
  • RPGRPG
  • RubyRuby
  • RustRust
  • ScalaScala
  • ShellShell
  • SwiftSwift
  • TerraformTerraform
  • TextText
  • TypeScriptTypeScript
  • T-SQLT-SQL
  • VB.NETVB.NET
  • VB6VB6
  • XMLXML
  • YAMLYAML
Java

Java static code analysis

Unique rules to find Bugs, Vulnerabilities, Security Hotspots, and Code Smells in your JAVA code

  • All rules 733
  • Vulnerability60
  • Bug175
  • Security Hotspot40
  • Code Smell458

  • Quick Fix 65
Filtered: 4 rules found
leak
    Impact
      Clean code attribute
        1. Proper Sensor Resource Management

           Code Smell
        2. "ThreadLocal" variables should be cleaned up when no longer used

           Bug
        3. Double Brace Initialization should not be used

           Bug
        4. Resources should be closed

           Bug

        "ThreadLocal" variables should be cleaned up when no longer used

        intentionality - complete
        reliability
        Bug
        Quick FixIDE quick fixes available with SonarQube for IDE
        • leak
        • performance

        Why is this an issue?

        More Info

        ThreadLocal variables are supposed to be garbage collected once the holding thread is no longer alive. Memory leaks can occur when holding threads are re-used which is the case on application servers using pool of threads.

        To avoid such problems, it is recommended to always clean up ThreadLocal variables using the remove() method to remove the current thread’s value for the ThreadLocal variable.

        In addition, calling set(null) to remove the value might keep the reference to this pointer in the map, which can cause memory leak in some scenarios. Using remove is safer to avoid this issue.

        Noncompliant code example

        public class ThreadLocalUserSession implements UserSession {
        
          private static final ThreadLocal<UserSession> DELEGATE = new ThreadLocal<>();
        
          public UserSession get() {
            UserSession session = DELEGATE.get();
            if (session != null) {
              return session;
            }
            throw new UnauthorizedException("User is not authenticated");
          }
        
          public void set(UserSession session) {
            DELEGATE.set(session);
          }
        
           public void incorrectCleanup() {
             DELEGATE.set(null); // Noncompliant
           }
        
          // some other methods without a call to DELEGATE.remove()
        }
        

        Compliant solution

        public class ThreadLocalUserSession implements UserSession {
        
          private static final ThreadLocal<UserSession> DELEGATE = new ThreadLocal<>();
        
          public UserSession get() {
            UserSession session = DELEGATE.get();
            if (session != null) {
              return session;
            }
            throw new UnauthorizedException("User is not authenticated");
          }
        
          public void set(UserSession session) {
            DELEGATE.set(session);
          }
        
          public void unload() {
            DELEGATE.remove(); // Compliant
          }
        
          // ...
        }
        

        Exceptions

        Rule will not detect non-private ThreadLocal variables, because remove() can be called from another class.

          Available In:
        • SonarQube IdeCatch issues on the fly,
          in your IDE
        • SonarQube CloudDetect issues in your GitHub, Azure DevOps Services, Bitbucket Cloud, GitLab repositories
        • SonarQube Community BuildAnalyze code in your
          on-premise CI
          Available Since
          9.1
        • SonarQube ServerAnalyze code in your
          on-premise CI
          Developer Edition
          Available Since
          9.1

        © 2008-2025 SonarSource SA. All rights reserved.

        Privacy Policy | Cookie Policy | Terms of Use