2011-10-21 19 views
5

Ho cercato di apprendere modelli di progettazione. This site utilizza la parola chiave synchronized, ma non capisco cosa faccia.Cosa significa "sincronizzato" in Java?

Ho cercato sulla rete e ho scoperto che è in qualche modo correlato al multi-threading e alla memoria, ma sono un ingegnere meccanico e non capisco cosa significhi.

Qualcuno può aiutarmi a capire le discussioni e la parola chiave synchronized?

+3

'synchronized' è parola chiave specifica Java. –

+1

Il codice nel collegamento non è C++. – Skizz

+1

Il primo punto è che gli esempi di codice a cui ti sei collegato sono Java non C++. –

risposta

12

Non esiste una parola chiave synchronized in C++.

C'è una in Java, però, dove per i metodi it means the following two things:

  • Non è possibile che due invocazioni di metodi sincronizzati sullo stesso oggetto per interlacciare. Quando un thread sta eseguendo un metodo sincronizzato per un oggetto, tutti gli altri thread che invocano metodi sincronizzati per lo stesso blocco oggetto (sospendi l'esecuzione) finché il primo thread non viene eseguito con l'oggetto.
  • Quando un metodo sincronizzato viene chiuso, stabilisce automaticamente una relazione prima-evento con qualsiasi successiva chiamata di un metodo sincronizzato per lo stesso oggetto. Ciò garantisce che le modifiche allo stato dell'oggetto siano visibili a tutti i thread.

Similar rules apply to arbitrary blocks.

Inoltre, raccomando di imparare da un libro sottoposto a peer-review, non da un sito web arbitrario e non autorevole.

+0

grazie mille @tomalak :) –

+0

@CAD_coding: Nessun problema –

8

Nella (Java) esempio

public static synchronized Singleton getInstance() 

significa che solo un thread alla volta dovrebbe essere in grado di accedere al metodo getInstance() questo per evitare una condizione di corsa.

+0

Solo _per-oggetto._ –

+0

@anders ringrazia molto che è stato molto utile –

3

Come già sottolineato dai commentatori, la sincronizzazione è una parola chiave Java.

Significa che il metodo non può essere eseguito da due thread contemporaneamente e che la JVM ha cura di applicarla.

In C++, sarà necessario utilizzare un costrutto di sincronizzazione, come una sezione critica o un mutex. È possibile consultare this.

0

Se un thread tenta di leggere i dati e altri thread tenta di aggiornare gli stessi dati, questo porta allo stato incoerente .

Ciò può essere evitato sincronizzando l'accesso ai dati. Usa “sincronizzato” metodo:

public synchronized void update() 
{ 
… 
}