Why is double-checked locking not used properly in the implementation of System.console() in the openJDK?
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
add a comment |
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
add a comment |
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
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
java singleton double-checked-locking system-console
asked Nov 14 '18 at 0:48
RuiRui
1,07411540
1,07411540
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
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.
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
add a comment |
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.
add a comment |
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.
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.
answered Nov 14 '18 at 2:03
NPrasNPras
1,101718
1,101718
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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