Domanda

Si consideri una variabile di tipo primitivo con un sacco di fili di lettura e qualche filo di scrittura, sarà il seguente lavoro codice correttamente?

Se lo farà, lo fa fornire prestazioni migliori rispetto a 1). dichiarando sincronizzati su tutti i metodi; 2). utilizzando un ReadWriteLock esplicito?

E 'questo un modello comune? In caso contrario, quale schema di solito è usato in questa situazione?

Questo funziona attualmente bene per me, ma mi sento che è un po 'ridondante da utilizzare sia volatile e sincronizzato.

private volatile int value = 1;

public void func1()
{
    if (value == 1) {
        // do something
    }
}

public void func2()
{
    if (value == 2) {
        // do something
    }
}

public void func3()
{
    if (value == 3) {
        // do something
    }
}

public synchronized void increase()
{
    if (value < 10) value++;
}

public synchronized void decrease()
{
    if (value > 0) value--;
}
È stato utile?

Soluzione

  

Si consideri una variabile di tipo primitivo con un sacco di fili di lettura e qualche filo di scrittura, sarà il seguente lavoro codice correttamente?

Credo di sì.

  

Se lo farà, lo fa fornire prestazioni migliori rispetto a 1). dichiarando sincronizzati su tutti i metodi; 2). utilizzando un ReadWriteLock esplicito?

Credo di sì, a condizione che le operazioni di lettura più numerose richieste di scrittura. Tuttavia:

  • A meno che questo contatore è molto conteso, probabilmente non importa. Non sprecate il vostro tempo qualcosa di micro-ottimizzazione se non si ha la prova che è (o sarà) un collo di bottiglia.
  • Se davvero è importante per voi, punto di riferimento di esso.
  • non stupitevi se la performance relativa dipende versioni di JVM / livelli di patch, le opzioni JVM e hardware; per esempio. numero di processori e architettura di memoria.
  

E 'questo un modello comune? In caso contrario, quale schema di solito è usato in questa situazione?

Non so se questo è comune. Ma la mia sensazione è che l'approccio più comune è quello di utilizzare solo la sincronizzazione regolare, e non ti preoccupare. A meno che non si tratta di una struttura di dati altamente sostenuto, la differenza di prestazioni tra i diversi approcci sarà insignificante per le prestazioni generali dell'applicazione.

Altri suggerimenti

Sì, è comune, almeno in una certa misura:)

Il modello che si sta utilizzando è descritto in questo articolo IBM -> http://www.ibm.com/developerworks/java/library/j-jtp06197/index.html

(modello # 5, a buon mercato di lettura-scrittura di blocco trick)

Sono sicuro che fornisce prestazioni migliori, dal momento che non v'è alcun blocco, ma se sia corretto dipende l'intento del codice. Di certo, il comportamento è diverso dal caso sincronizzato. Se il comportamento è simile al caso di blocco dipende da dove si blocca.

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