Deadlock quiz

Suppose you have this class:

public class Singleton implements Runnable {
	public static final String A_STRING = "Hello World".toLowerCase();

	public static final Singleton INSTANCE = new Singleton();

	public static Singleton getInstance() {
		return INSTANCE;

	private Singleton() {

	public void launchThread() {
		synchronized (this) {
			Thread t = new Thread(this);
			while (t.isAlive()) {
				try {
				} catch (InterruptedException e) {
					// Interrupted.

	public void run() {

	public static void main(String[] args) {

If you run the main method, it hangs in a deadlock. Can you see the reason?


  1. matthewsteele

    Why is A_STRING and run() part of the class? It doesn’t seem like it’s getting called anywhere…

  2. run() is called from Thread.start(), since the class implements Runnable (Lines 17, 18)

  3. matthewsteele

    I’ve been reading up on concurrency in Java all weekend, and I’m still no closer to figuring this out.

    Does it have to do with the object being locked is the class (since you’re performing synchronized() in a singleton), as opposed to an instance of the object?

    I give up. What’s the answer?

  4. Piotr Smolinski

    Consider slight modification:

    public static final String A = “Hello World”;
    public static final String B = “Hello World”.toLowerCase();


    public void run() {

    The code locks on System.out.println(B);
    If you remove also synchronized section from launchThread() and use Thread.sleep(100) the situation is the same.

    In my opinion this is due to different initialization of A and B. The first one is literal (compile-time constant) while the second one must be initialized. Therefore JVM delays B access until class is statically initialized (which happens when the thread ends).

  5. Allan Ramirez

    After t.start() is called, the caller thread would return and the other thread (t) would call run method.

    The other thread (t) cannot call run method because the caller thread still holds the lock. Therefore the other thread (t) will always be alive and the caller thread will be stucked to while block forever.

  • My Open Source

  • Twitter Updates

    • @micho Infovia anyone? 2 hours ago
    • After days in Elixir, I write Ruby like: class Scoped.Thing do def baz do do_something() end end And wonder why it doesn’t parse 7 hours ago
    • RT @islomar: A piece of advice for anyone applying for a job: clearly transmit your MOTIVATIONS, GOALS and WHYS, not just a bunch of topics… 11 hours ago
    • RT @realntl: @wycats We want to say "sorry mgmt, we made a mess and need time to rewrite" but "the lang/framework sucks and we need to migr… 20 hours ago
    • @MarkVillacampa Al menos con todo esto, alguna gente aprenderá a actualizarse y por qué. Sobre todo la oposición! 21 hours ago
  • Enter your email address to follow this blog and receive notifications of new posts by email.

    Join 9 other followers

  • Flickr Photos

%d bloggers like this: