[Client/Serveur][Multi-Thread] Serveur/ Fcts synchronisées

loring Messages postés 4 Date d'inscription lundi 18 octobre 2004 Statut Membre Dernière intervention 4 novembre 2004 - 18 oct. 2004 à 23:34
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 - 22 oct. 2004 à 00:04
J'ai une application Client/Serveur. Les clients accèdent aux fonctions du serveurs qui lui ensuite accède à ma base de données.

CLIENT < -- > SERVEUR < -- > BD

Par exemple, j'ai une fct:

public boolean updateUser( int idUser, String nouveauNom, String nouvelleAdresse, String nouveau noTel ){?}

Si deux clients accèdent à cette fonction au mème moment et que je ne la déclare pas "synchronized"...On ne peut prédire le résultat final dans la BD. Donc, je dois déclarer les fcts du serveurs "synchronized" pour éviter ce genre de problème.

Mais ce qui cause mon problème c'est le fait qu'une seule fct synchronisée peut être appellée sur un même object à la fois. Donc, le ?serveur? devient très inefficace étant donné qu'il traite les appels séquentiellement et non de manière concurrente

Voici un exemple, j'ai deux fonctions sur le serveur:

public synchronized void uploaderFichierSurServeur( byte[] fichier ){?}
public synchronized boolean updateUser( int idUser, String nouveauNom ){?}

Je veux que le client 1 puisse "uploader" un fichier sur le serveur et qu'au même moment le client 2 puisse mettre à jour les infos d'un utilisateur. Deux fcts synchronisées ne peuvent être appellées au même moment(d'après ce que j'ai lu). Donc si un client upload un gros fichier pendant 2 minutes, aucun autre client n'a accès aux autres fcts synchronisées du serveur pendant ce temps. Vrai ou faux ? Est-ce que je me trompe ? Y a-t-il une façon d'éviter ce problème.

Merci.

6 réponses

cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
19 oct. 2004 à 10:33
:big) Neodante :big)

Le synchronized ne sert qu'à poser un lock sur un objet lorsque celui-ci peut changer d'état, par ex tu as une autre fonction qui vérifie l'état d'un objet, il se peut qu'une Thread accède à celle-ci et renvoie du coup un état qui soit faux parce qu'une autre Thread qui s'est endormi était en passe de changer cet état ... en gros voilà souvent ceux à quoi ça sert ...
Mais si tu as faits plusieurs Thread avec dans chaque une variable qui contiendra ton fichier y a pas de soucis à te faire ... sinon les threads ne servirait pas à grand chose non ???

Pour ce qui est de la base de données c'est elle qui s'occupe de faire cela, on appel ça les transactions et par défaut JDBC est en autoCommit(true) ...

Je pense que tu t'inquiètes trop ... je ne connais pas le reste de ton code mais je pense que cela doit être bon ...

[Responsable www.neogamedev.com]
0
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
19 oct. 2004 à 10:37
:big) Neodante :big)

En fait je rajouterais que deux fonctions "ifférentes peuvent être appellées au même moment si le lock n'est pas sur le même objet ...
Je pense qu'il faudrait que tu relises un chapitre sur les Threads parce que bien que cela ne soit pas compliqué à première vue (une fois qu'on a compris), le mécanisme n'est pas toujours simple à bien comprendre ... et c'est aussi assez difficile à expliqué sans graph et sans faire 20 pages ... ;-)
@+

[Responsable www.neogamedev.com]
0
loring Messages postés 4 Date d'inscription lundi 18 octobre 2004 Statut Membre Dernière intervention 4 novembre 2004
19 oct. 2004 à 17:43
D'abord, merci pour prendre de ton temps pour me répondre.

Premièrement, je crois que les fcts du serveurs doivent êtres synchronisées pour ne pas qu'elles soient appellées par plusieurs clients à la fois. Est-ce que je me trompe?

Deuxièmement, le problème est que 2 fcts déclarées "synchronized" ne peuvent êtres appellées au même moment, car le "lock" est sur l'object qui contient les fcts ...donc le serveur. Est-ce que je me trompe?

Merci.
0
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
19 oct. 2004 à 22:34
:big) Neodante :big)

Premièrement, cela dépend vraiment de ce que ton serveur fait et des fonctions ... là dessus je ne peux pas trop t'aider !!! ;-)

Deuxièmement, cela dépend ce que tu as à locker ... est-ce que tu as réellement besoin de locker ton objet complet ou alors est-ce que les fonctions de ton objet serveur ne pourrais t-elle pas être lockées ... je pense que ton problème est dû plus à une mauvaise conception ... tu peux très bien utiliser un simple lock de la manière suivante :

synchronized (objet){

}

C'est juste un truc en plus ...
Sinon ici sans avoir le code c'est plutôt dur de répondre correctement à ta question ... car ici c'est plutot un prob d'architecture ...
@+

[Responsable www.neogamedev.com]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
loring Messages postés 4 Date d'inscription lundi 18 octobre 2004 Statut Membre Dernière intervention 4 novembre 2004
21 oct. 2004 à 16:13
Finalement, je crois que la solution est synchronisés des bloques de code tel que vous me l'avez proposé.

Exemple
public class Serveur{
...
public void fct1( ... ){
Object synchro1 = new Object();
...
synchronized( synchro1 ){
...
}
...
}

public void fct2(int id){
Object synchro2 = new Object();
...
synchronized( synchro2 ){
...
}
...
}
}

De cette maniere chaque fct ne peut être accèdée que par un seul client à la fois. De plus, le serveur n'est pas "bloqué" à chaque appel de fct...comme avec l'utilisation de...

public void synchronized fct3( ... ){ ... }

Donc si personne ne détecte de problème avec cette solution...le problème est réglé!
0
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
22 oct. 2004 à 00:04
:big) Neodante :big)

Je te dirais : essaye et tu modifieras si cela n'est pas bon ... je suppose que tu fais des test ... ;-)
@+

[Responsable www.neogamedev.com]
0
Rejoignez-nous