2013-05-18 3 views
1

Mon application doit parfois lire et écrire dans un fichier. Et ce travail pourrait se produire dans multithread, donc je devrais synchroniser ces ressources. Voici mon code:Android: Comment synchroniser la ressource dans le bon sens

// write to file 
FileOutputStream fos = openFileOutput("data.dat", Context.MODE_PRIVATE); 
synchronized (fos) { 
    ObjectOutputStream writer = new ObjectOutputStream(fos);  
    // continue to write 
} 

// read to file 
FileInputStream fis = openFileInput("data.dat"); 
synchronized (fis) { 
    ObjectInputStream reader = new ObjectInputStream(fis); 
    // continue to read 
} 

est-ce que le code ci-dessus est sûr? cela signifie que "data.dat" peut toujours juste lire ou écrire, et juste dans un thread? Si c'est faux, corrigez-moi s'il vous plaît.

Merci de

+0

Il y a 2 problèmes: les 2 verrous ne sont pas identiques, donc la lecture et l'écriture du fichier ne s'excluent pas mutuellement. Plus important encore, vous semblez utiliser une variable locale comme un verrou qui va complètement à l'encontre du but: chaque thread aura un verrou différent et les accès concurrents ne seront pas bloqués. – assylias

+0

@assylias donc, pouvez-vous recommander des idées s'il vous plaît. Je ne peux pas seulement synchroniser la méthode, parce que peut-être un autre thread peut accéder à ces ressources, sans utiliser cette méthode. Merci :) – hqt

+0

En supposant que ce sont des méthodes d'instance (c'est-à-dire non statiques), vous pouvez déclarer un objet final privé lock = new Object(); 'dans votre classe, et l'utiliser comme un verrou. De cette façon, tous les accès par tous les threads à ces deux parties de code seront exclusifs. – assylias

Répondre

2

Utilisez le verrouillage du fichier: http://en.wikipedia.org/wiki/File_locking à dire d'autres threads que le fichier de sortie est en cours d'utilisation. Si le fichier de sortie est utilisé exclusivement par votre application, alors synchronized devrait empêcher les autres threads de faire cette portion de code en même temps. Ou, enfin, vous pouvez envisager d'utiliser IntentService pour mettre en file d'attente les demandes et les traiter une par une

+0

Si j'utilise 'FileLock', les différents threads et processus attendront jusqu'à ce que la ressource ait été déverrouillée, n'est-ce pas? Ou, ils vont jeter l'exception? Merci :) – hqt

+0

cela dépend de votre implémentation car le verrou est quelque chose que votre code doit gérer. Vous essayez juste d'obtenir un verrou sur une certaine ressource (c'est-à-dire un fichier) si vous l'obtenez, alors vous faites votre tâche et ensuite relâchez le verrou. Si vous ne pouvez pas obtenir le verrou, vous pouvez attendre et réessayer ou lancer une exception ou faire autre chose. C'est à vous –

Questions connexes