Synchronized: Warum final?



  • Hallo,

    warum ist es ein Problem, wenn man so etwas schreibt:

    public class ID {
        private static Integer counter;
    
        private Integer id;
    
        public ID() {
            synchronized (counter) {
                id = counter;
                counter++;
            }
        }
    }
    

    Ist es so korrekter?:

    public class ID {
        private final Object lock = new Object();
        private static Integer counter;
    
        private Integer id;
    
        public ID() {
            synchronized (lock) {
                id = counter;
                counter++;
            }
        }
    }
    

    Ich verstehe nicht so ganz, warum Java gerne eine als final definierte Variable im synchronized stehen haben will...

    Grüße,
    Michael



  • Das ist mir neu. Wo hast du das denn her?



  • Netbeans warnt davor, ein Objekt, das nicht final ist in ein synchronized zu packen. Oder habe ich etwas falsch verstanden?!



  • XDVD schrieb:

    Netbeans warnt davor, ein Objekt, das nicht final ist in ein synchronized zu packen. Oder habe ich etwas falsch verstanden?!

    Weil du in einem anderen Thread das Objekt verändern könntest. Shade meinte wohl Warning != Java will gerne eine als final definierte Variable im synchronized stehen haben. Dachte wohl an einen Fehler der ausgespuckt wird.

    MfG SideWinder


Anmelden zum Antworten