2009-09-25 4 views
2

Si j'ai une structure de données dans une application multithread que je veux accéder simultanément avec des lectures alors qu'il n'est pas modifié, mais interdire l'accès en lecture et en écriture aux autres threads pendant que l'on écrit?Comment autoriser les lectures simultanées mais bloquer tous les accès lors d'une écriture sur un objet Java?

Pour simplifier, disons que j'ai un tableau et deux méthodes read() et write():

int[] rgData; 

// ... 

int read(int ix) { 
    return rgData[ix]; 
} 

void write(int ix, int val) { 
    rgData[ix] = val; 
} 

En réalité, la structure de données et les deux méthodes d'accès sont plus complexes. Maintenant, si j'utilise des moniteurs d'objet de Java et envelopper les appels à read() et write() comme celui-ci

synchronized (rgData) { 
    int val = read(ix); 
} 

Je n'ai pas plus lit en même temps, ce qui est triste, parce que la lecture simultanée est pas un problème et d'écriture sont rares.

Une solution peut être de faire tous les travaux en lecture et en écriture via un gestionnaire commun qui gère une file d'attente et un pool de threads. Les travaux de lecture sont exécutés simultanément, si un travail d'écriture arrive, il attend que tous les travaux en cours se terminent et la file d'attente n'est pas traitée pendant l'exécution du travail d'écriture. Mais y a-t-il quelque chose de plus simple?

Répondre

3

Utilisez un ReadWriteLock. Il fait exactement ce dont vous avez besoin.

+0

de chilitom C'était une condition de course de réponse. Accepté vôtre et dtsazza's upvoted –

4

Vous souhaitez utiliser le ReadWriteLock, introduit dans Java 1.5 qui gère exactement cette situation.

+0

C'était une condition de course de réponse. Upvoted vôtre et accepté –

Questions connexes