Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Affectations , synchronized et multi tâche

2 réponses
Avatar
JBB
Bonjour,

J'ai une donnée (de type String) partagée entre plusieurs Thread.

Je fais donc quelque chose du genre:

class DonneePartagee
{
private String _valeur = "";

public void set(String v) { _valeur = v;}
public String get() { return _valeur ;}
}

Et la forcement se pose la question des accès simultanés.

Je rajoute donc des synchronized:
class DonneePartagee
{
private String _valeur = "";

public synchronized void set(String v) { _valeur = v;}
public synchronized String get() { return _valeur ;}
}

Mais je me demande si c'est bien nécéssaire.
La classe String étant non modifiable ( on peut remplacer une String par
une autre mais pas modifier le contenu de l'objet), pour un peu que
l'affectation ( le = ) soit atomique ( la tache ne peut pas être
preemptée à ce moment) , je n'aurais même pas besoin de rajouter des
synchronized.

Les affectations (objet à objet) sont elles atomiques ?
Les affectations des types simple ( boolean,short,int,double) sont elles
atomiques ( là j'ai plus de doutes car il peux y avoir des cast si on
affecte des types différents par exemple un short dans un double).

Merci.

2 réponses

Avatar
Hervé AGNOUX
Je n'ai pas réussi à retrouver les références, alors je te dis juste ce que
j'avais calé dans ma tête sur ces questions.

En java il est impossible, de garantir la protection contre les accés
concurrents d'une portion de code, sauf avec synchronized, y compris pour
les variables et les situations les plus simples.

La seule exception est le chargement et l'initialisation statique d'une
classe, en ce sens que on a la garantie qu'une classe est entièrement
chargée et initialisée avant d'être utilisée. Donc, tu peux utiliser une
classe depuis plusieurs threads à la fois sans te préoccuper de savoir quel
est le premier qui la charge, toute son initialisation statique se passera
sans anicroches, ce qui est déjà un sérieux soucis de moins !

Pour ton cas précis, de set et de get avec affectation d'une seule variable,
il ne faut penser à le synchroniser que si tu es en environnement
multi-processeur. Néanmoins, même en environnement mono-processeur, rien
n'est garanti, car tu peux te retrouver sur un "vieil" environnement où les
références d'objet sont codées sur une unité plus large que l'unité d'accés
du processeur.

Pour ma part, dans le cas qui est le tiens, je ne synchroniserai pas. Je ne
synchronise que si il y a une séquence d'instructions java, ce qui est une
erreur, mais erreur raisonnable :-)

Tu pourras trouver d'autres précisisions sur ces forums si tu parles
anglais :

http://forum.java.sun.com/thread.jspa?forumID1&threadIDV4011
http://forum.java.sun.com/thread.jspa?forumID%6&threadIDR4202

A+.


JBB wrote:

Bonjour,

J'ai une donnée (de type String) partagée entre plusieurs Thread.

Je fais donc quelque chose du genre:

class DonneePartagee
{
private String _valeur = "";

public void set(String v) { _valeur = v;}
public String get() { return _valeur ;}
}

Et la forcement se pose la question des accès simultanés.

Je rajoute donc des synchronized:
class DonneePartagee
{
private String _valeur = "";

public synchronized void set(String v) { _valeur = v;}
public synchronized String get() { return _valeur ;}
}

Mais je me demande si c'est bien nécéssaire.
La classe String étant non modifiable ( on peut remplacer une String par
une autre mais pas modifier le contenu de l'objet), pour un peu que
l'affectation ( le = ) soit atomique ( la tache ne peut pas être
preemptée à ce moment) , je n'aurais même pas besoin de rajouter des
synchronized.

Les affectations (objet à objet) sont elles atomiques ?
Les affectations des types simple ( boolean,short,int,double) sont elles
atomiques ( là j'ai plus de doutes car il peux y avoir des cast si on
affecte des types différents par exemple un short dans un double).

Merci.


--
Hervé AGNOUX
http://www.diaam-informatique.com

Avatar
TestMan
Bonjour,

J'ai une donnée (de type String) partagée entre plusieurs Thread.

Je fais donc quelque chose du genre:

class DonneePartagee
{
private String _valeur = "";

public void set(String v) { _valeur = v;}
public String get() { return _valeur ;}
}

Et la forcement se pose la question des accès simultanés.

Je rajoute donc des synchronized:
class DonneePartagee
{
private String _valeur = "";

public synchronized void set(String v) { _valeur = v;}
public synchronized String get() { return _valeur ;}
}

Mais je me demande si c'est bien nécéssaire.
La classe String étant non modifiable ( on peut remplacer une String par
une autre mais pas modifier le contenu de l'objet), pour un peu que
l'affectation ( le = ) soit atomique ( la tache ne peut pas être
preemptée à ce moment) , je n'aurais même pas besoin de rajouter des
synchronized.

Les affectations (objet à objet) sont elles atomiques ?
Les affectations des types simple ( boolean,short,int,double) sont elles
atomiques ( là j'ai plus de doutes car il peux y avoir des cast si on
affecte des types différents par exemple un short dans un double).

Merci.


Bonjour,

Tout dépend du JIT utilisé et de la configuration matérielle sur
laquelle on se trouve, il me semble que sous HotSpot c'est atomique ...
mais je ne trouve plus mon lien.

Pour faire plus simple, si l'on veut des choses atomiques, il vaut mieux
utiliser :
java.util.concurrent.atomic

Plus de lecture sur :
http://www.cs.umd.edu/~daveho/research/ecoop2002.pdf

A+

TM