2012-05-21

Java: thread-safe singleton

Por uma sequência de tweets, deram-me este código via Pastebin. Como acho que vai ser útil um dia destes, copio-o para aqui.

P.S.: tem erros.


     
    //Before editing: This code is an example for a friend, it was not proofread nor compiled!
     
    //Tipical and very bad:
     
    public class Foo {
     
            private static final Foo instance;
     
            public static Foo getFoo() {
                    if (instance == null) {
                            instance = new Foo()
                    }
                    return foo;
            }
    }
     
     
    //Double verification, unsafe and requires a dummy object:
    public class Foo {
     
            private static final Foo instance;
            private static final obj = new object;
     
            public static Foo getFoo() {
                    if (instance == null) {
                            synchronized(obj) {
                                    if (instance == null) {
                                            instance = new Foo()
                                    }
                            }
                    }
                    return foo;
            }
    }
     
     
    //Synchronized at the method level efectively serializes threads
    public class Foo {
     
            private static final Foo instance;
     
            public static synchronized Foo getFoo() {
                    if (instance == null) {
                            instance = new Foo()
                    }
                    return foo;
            }
    }
     
     
    //This is how we should do it:
    public class Foo {
     
            private static class Holder {
                    public static final Foo INSTACNE = new Instance();
            }
     
            public static Foo () {
                    return Holder.INSTANCE;
            }
    }

conversão via JavaToHtml

Agradecimentos ao Tiago pelo código.

7 comments:

Peres said...

INSTACNE, será isto a puberdade de um geek?

Pedro Francisco said...

LOOOOL se calhar... :p

Sintra said...

Fook this.

Peres said...

Foo sintra, é Foo

Sintra said...

Foo-te Peres, foo-te!

Peres said...

Segmentation fault Sintra

Pedro Francisco said...

PUA!