Why is double-checked locking not used properly in the implementation of System.console() in the openJDK?










2















In the openJDK source code, the System.console() was implemented as such:



 private static volatile Console cons = null;
/**
* Returns the unique @link java.io.Console Console object associated
* with the current Java virtual machine, if any.
*
* @return The system console, if any, otherwise <tt>null</tt>.
*
* @since 1.6
*/
public static Console console()
if (cons == null)
synchronized (System.class)
cons = sun.misc.SharedSecrets.getJavaIOAccess().console();


return cons;



IMO, this implementation is lack of the double-checked locking, say the null test inside the synchronized block is absent. In this case assuming 2 threads, thread I gets into the synchronized monitor and, in the same time thread II coincidentally gets blocked on the same synchronized monitor, as a result, thread II would also get chance to call the cons = sun.misc.SharedSecrets.getJavaIOAccess().console(); to initialized the Console object again



Question: Why isn't the double-checked locking used properly in this case? Is this really a flaw of the openJDK?










share|improve this question


























    2















    In the openJDK source code, the System.console() was implemented as such:



     private static volatile Console cons = null;
    /**
    * Returns the unique @link java.io.Console Console object associated
    * with the current Java virtual machine, if any.
    *
    * @return The system console, if any, otherwise <tt>null</tt>.
    *
    * @since 1.6
    */
    public static Console console()
    if (cons == null)
    synchronized (System.class)
    cons = sun.misc.SharedSecrets.getJavaIOAccess().console();


    return cons;



    IMO, this implementation is lack of the double-checked locking, say the null test inside the synchronized block is absent. In this case assuming 2 threads, thread I gets into the synchronized monitor and, in the same time thread II coincidentally gets blocked on the same synchronized monitor, as a result, thread II would also get chance to call the cons = sun.misc.SharedSecrets.getJavaIOAccess().console(); to initialized the Console object again



    Question: Why isn't the double-checked locking used properly in this case? Is this really a flaw of the openJDK?










    share|improve this question
























      2












      2








      2


      1






      In the openJDK source code, the System.console() was implemented as such:



       private static volatile Console cons = null;
      /**
      * Returns the unique @link java.io.Console Console object associated
      * with the current Java virtual machine, if any.
      *
      * @return The system console, if any, otherwise <tt>null</tt>.
      *
      * @since 1.6
      */
      public static Console console()
      if (cons == null)
      synchronized (System.class)
      cons = sun.misc.SharedSecrets.getJavaIOAccess().console();


      return cons;



      IMO, this implementation is lack of the double-checked locking, say the null test inside the synchronized block is absent. In this case assuming 2 threads, thread I gets into the synchronized monitor and, in the same time thread II coincidentally gets blocked on the same synchronized monitor, as a result, thread II would also get chance to call the cons = sun.misc.SharedSecrets.getJavaIOAccess().console(); to initialized the Console object again



      Question: Why isn't the double-checked locking used properly in this case? Is this really a flaw of the openJDK?










      share|improve this question














      In the openJDK source code, the System.console() was implemented as such:



       private static volatile Console cons = null;
      /**
      * Returns the unique @link java.io.Console Console object associated
      * with the current Java virtual machine, if any.
      *
      * @return The system console, if any, otherwise <tt>null</tt>.
      *
      * @since 1.6
      */
      public static Console console()
      if (cons == null)
      synchronized (System.class)
      cons = sun.misc.SharedSecrets.getJavaIOAccess().console();


      return cons;



      IMO, this implementation is lack of the double-checked locking, say the null test inside the synchronized block is absent. In this case assuming 2 threads, thread I gets into the synchronized monitor and, in the same time thread II coincidentally gets blocked on the same synchronized monitor, as a result, thread II would also get chance to call the cons = sun.misc.SharedSecrets.getJavaIOAccess().console(); to initialized the Console object again



      Question: Why isn't the double-checked locking used properly in this case? Is this really a flaw of the openJDK?







      java singleton double-checked-locking system-console






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 14 '18 at 0:48









      RuiRui

      1,07411540




      1,07411540






















          1 Answer
          1






          active

          oldest

          votes


















          0














          It's likely because the Console object returned by sun.misc.SharedSecrets.getJavaIOAccess().console() is already initialised as a static-block singleton anyway. The worst that could happen is that cons gets set to the same thing again.



          Is it ideal? Probably not. Is it intentional? Maybe. Will it cause side effects? I don't think so.






          share|improve this answer






















            Your Answer






            StackExchange.ifUsing("editor", function ()
            StackExchange.using("externalEditor", function ()
            StackExchange.using("snippets", function ()
            StackExchange.snippets.init();
            );
            );
            , "code-snippets");

            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "1"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );













            draft saved

            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53291607%2fwhy-is-double-checked-locking-not-used-properly-in-the-implementation-of-system%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            It's likely because the Console object returned by sun.misc.SharedSecrets.getJavaIOAccess().console() is already initialised as a static-block singleton anyway. The worst that could happen is that cons gets set to the same thing again.



            Is it ideal? Probably not. Is it intentional? Maybe. Will it cause side effects? I don't think so.






            share|improve this answer



























              0














              It's likely because the Console object returned by sun.misc.SharedSecrets.getJavaIOAccess().console() is already initialised as a static-block singleton anyway. The worst that could happen is that cons gets set to the same thing again.



              Is it ideal? Probably not. Is it intentional? Maybe. Will it cause side effects? I don't think so.






              share|improve this answer

























                0












                0








                0







                It's likely because the Console object returned by sun.misc.SharedSecrets.getJavaIOAccess().console() is already initialised as a static-block singleton anyway. The worst that could happen is that cons gets set to the same thing again.



                Is it ideal? Probably not. Is it intentional? Maybe. Will it cause side effects? I don't think so.






                share|improve this answer













                It's likely because the Console object returned by sun.misc.SharedSecrets.getJavaIOAccess().console() is already initialised as a static-block singleton anyway. The worst that could happen is that cons gets set to the same thing again.



                Is it ideal? Probably not. Is it intentional? Maybe. Will it cause side effects? I don't think so.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 14 '18 at 2:03









                NPrasNPras

                1,101718




                1,101718



























                    draft saved

                    draft discarded
















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53291607%2fwhy-is-double-checked-locking-not-used-properly-in-the-implementation-of-system%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    這個網誌中的熱門文章

                    Barbados

                    How to read a connectionString WITH PROVIDER in .NET Core?

                    Node.js Script on GitHub Pages or Amazon S3