Java >> Java tutorial >  >> Java

Hvordan fungerer synkroniseringsfunktionen i java?

Under hætten bruger den to opcodes 09 og 18 på bytekodeniveauet, som erhverver/frigiver låse på en objektreference på globalt JVM-niveau. Jeg anbefaler stærkt, at du læser, hvordan den virtuelle Java-maskine udfører trådsynkronisering.


Det eller de største problemer, vi møder med en flertrådskode, er deling af data, og jeg er enig i, formålet med samtidighedsparalliseringsprocessen, og det sker "ofte", at tråde under parallaliseret behandling skal have adgang til at læse/skrive på delte data.

Det java-synkroniserede søgeord tillader følgende:

Den beder JVM om at sætte en lås på skærmen af ​​objektet eller delen af ​​den synkroniserede kode, hvilket giver den eksklusiv adgang til den del af koden eller objektet.

Her er et eksempel på en Singleton:

public class Singleton {
    private Singleton INSTANCE;

    private Singleton() {
    }

    public Singleton getInstance() {
        if (null == INSTANCE) {
            INSTANCE = new Singleton();
        }
        return INSTANCE;
    }
}

Denne Singleton er ikke trådsikker , hvis en tråd forsøger at få en instans, mens en anden også forsøger at gøre det samme (race-betingelse), kan det ske, at før det tråd nummer et afslutter oprettelsen af ​​instansen, har den anden allerede haft adgang til 26 metode og skabte sin egen forekomst af Singleton, hvilket betyder, at vi på et T-tidspunkt skulle have to forekomster af Singleton (kaldet multiton på det tidspunkt).

For at løse dette problem er vi nødt til at synkronisere singletonens kreative adfærd, dette kan gøres ved hjælp af nøgleordet 38 over if-sætningen på 40 sig selv:

public class Singleton {
    private Singleton INSTANCE;

    private Singleton() {
    }

    public Singleton getInstance() {
        synchronized (Singleton.class) {
            if (null == INSTANCE) {
                synchronized(Singleton.class) {
                   Singleton inst = new Singleton();
                   INSTANCE = inst;   
                }
            }
        }
        return INSTANCE;
    }
}

Resultatet er, når den første tråd spørger Singleton-forekomsten, og i løbet af oprettelsestiden vil JVM sætte en lås på skærmen af ​​INSTANCEN og nægter enhver adgang til INSTANCEN, indtil tråd en afsluttede sin anmodning.

Der er også forskellige måder at opnå det på, den før citerede bog er en fremragende kilde til læring, javadoc også.


Java tag