Domanda

    

Questa domanda ha già una risposta qui:

         

Qual è la differenza tra un metodo sincronizzato e blocco sincronizzato in Java?

Ho cercato la risposta in rete, le persone sembrano essere così sicuro di questo: - (

Il mio prendere sarebbe non v'è alcuna differenza tra i due, tranne che il blocco di sincronizzazione può essere più localizzata portata e quindi il blocco sarà di tempo minore ??

E in caso di blocco su un metodo statico, su ciò che viene presa la serratura? Qual è il significato di un blocco su di classe?

È stato utile?

Soluzione

Un metodo sincronizzato utilizza il ricevitore metodo come serratura (cioè this per metodi non statici, e la classe che contiene metodi statici). blocchi Synchronized usa l'espressione come un blocco.

Quindi, i seguenti due metodi sono equivalenti di bloccarsi prospettico:

synchronized void mymethod() { ... }

void mymethod() {
  synchronized (this) { ... }
}

Per i metodi statici, la classe sarà chiuso:

class MyClass {
  synchronized static mystatic() { ... }

  static mystaticeq() {
    syncrhonized (MyClass.class) { ... }
  }
}

Per blocchi sincronizzati, è possibile utilizzare qualsiasi oggetto non null come una serratura:

synchronized (mymap) {
  mymap.put(..., ...);
}

portata Blocco

Per i metodi sincronizzati, la serratura si terrà in tutto il metodo di applicazione, mentre nel blocco synchronized, il blocco viene mantenuto solo durante tale ambito blocco (altrimenti noto come sezione critica). In pratica, la JVM è consentito di ottimizzare rimuovendo alcune operazioni fuori l'esecuzione del blocco synchronized se può dimostrare che si può fare in sicurezza.

Altri suggerimenti

Un metodo sincronizzato è abbreviata. Questo:

class Something {
    public synchronized void doSomething() {
        ...
    }

    public static synchronized void doSomethingStatic() {
        ...
    }
}

è, a tutti gli effetti, equivalenti a questo:

class Something {
    public void doSomething() {
        synchronized(this) {
            ...
        }
    }

    public static void doSomethingStatic() {
        synchronized(Something.class) {
            ...
        }
    }
}

(dove Something.class è l'oggetto di classe per il Something classe).

Quindi, in effetti, con un blocco sincronizzato, si può essere più specifiche sul blocco, e più a grana fine di quando si desidera utilizzarlo, ma a parte questo non c'è alcuna differenza.

Sì, è una differenza. L'altra è che si può acquisire un blocco su altri oggetti che this.

La differenza chiave è questo: se si dichiara un metodo per sincronizzare, quindi l'intero corpo del metodo viene sincronizzato; se si utilizza il blocco sincronizzato, però, allora si può circondare solo la "sezione critica" del metodo nel blocco sincronizzato, lasciando il resto del metodo di blocco.

Se l'intero metodo fa parte della sezione critica, allora c'è alcuna differenza efficacemente. Se questo non è il caso, allora si dovrebbe utilizzare un blocco sincronizzato intorno solo la sezione critica. I più istruzioni che avete in un blocco sincronizzato, il parallelismo meno complesso si ottiene, così si vuole mantenere quelli al minimo.

A serrature metodo sincronizzato sulla istanza di oggetto metodo è contenuto in.

Qualora, in blocco sincronizzato può bloccare in qualsiasi oggetto - tipicamente un obect mutex definita come una variabile di istanza. Questo permette un maggiore controllo su ciò che le serrature sono in funzione.

  

Il mio prendere sarebbe non v'è alcuna differenza tra i due, tranne che il blocco di sincronizzazione può essere più localizzata portata e quindi il blocco sarà di tempo minore ??

Sì. Hai ragione. A differenza dei metodi synchronized, dichiarazioni sincronizzati devono specificare l'oggetto che fornisce il blocco intrinseco.

Esempio da java tutorial:

public void addName(String name) {
    synchronized(this) {
        lastName = name;
        nameCount++;
    }
    nameList.add(name);
}

bilanci sincrone sono utili anche per migliorare la concorrenza con sincronizzazione a grana fine. Si possono trovare buon esempio sulla stessa pagina tutorial per caso d'uso di seguito.

Si supponga, ad esempio, la classe MsLunch ha due campi di istanza, C1 e C2, che non vengono mai utilizzati insieme. Tutti gli aggiornamenti di questi campi devono essere synchronized, ma non c'è alcun motivo per impedire che un aggiornamento di c1 dall'essere interleaved con un aggiornamento di c2 - e così facendo riduce la concorrenza con la creazione di blocco inutili. Invece di usare metodi sincronizzati o altrimenti utilizzando il blocco associato a questo, creiamo due oggetti esclusivamente per fornire serrature .

  

E in caso di blocco su un metodo statico, su ciò che viene presa la serratura? Qual è il significato di un blocco su di classe?

In questo caso, il filo acquisisce la serratura intrinseca per l'oggetto classe associato alla classe. Così l'accesso ai campi statici della classe è comandato da una serratura che è distinta dalla serratura per qualsiasi istanza della classe.

Quando si effettua un metodo come sincronizzato (non static):

Non è possibile che due invocazioni di metodi synchronized sullo stesso oggetto per interlacciare. Quando un thread sta eseguendo un metodo sincronizzato per un oggetto, tutti gli altri thread che richiamano i metodi per lo stesso blocco oggetto (sospendere l'esecuzione) sincronizzati fino al primo filo avviene con l'oggetto.

Se si effettua un metodo come static synchronized:

Non è possibile che due invocazioni di metodi static synchronized su diversi oggetti della stessa classe per interlacciare. Quando un thread sta eseguendo un metodo static synchronized per un oggetto di classe A, tutti gli altri thread che richiamare i metodi static synchronized su una qualsiasi di oggetti di classe A blocco (sospendere l'esecuzione) fino al primo filo avviene con l'esecuzione del metodo.

Ci trovi alternative migliori per la sincronizzazione in questa domanda SE:

Evitare sincronizzato (questo) in Java?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top