Welcome to Bukkit France

Inscrivez-vous maintenant pour profiter d'un accès total à tout le contenu offert par la meilleur communauté Bukkit française ! Une fois inscrit et connecté, vous pourrez contribuez à la communauté en postant vos propres sujets et questions ou en répondant à ceux existants. Vous pourrez aussi customiser votre profil, recevoir des points de réputations, communiquer avec les autres membres via le chat, et plus encore! 

  • Annonces

    • Pskyco

      Bukkit France passe sous Discord !   02/20/16

      Bukkit France est désormais passé sur Discord, au revoir donc notre vieux Teamspeak ! Téléchargez le client et venez nous rejoindre sur notre salon en suivant les instructions suivantes.
      M-à-j du 25/02/2017 : Désormais, seuls les comptes actifs sur le forum se verront donner l'accès au Discord, ce dernier n'est pas une plateforme d'aide de la même manière que le chat.
Dow1t

JAVA Mot clef incompréhensible

9 messages dans ce sujet

Bonjour je fais appel à vous car en ce moment je me promène sur des repo github et j'ai trouver 2_3 mot clef que je ne comprends pas 

 

Ils s'agit de serializable volatile native et transient

 

J'ai été voir sur internet mais les explications me sont incomprises

 

Pourriez vous m'expliquer à quoi ils servent et un petit exemple ou on les utilisent 

 

Merci à vous :)

 

Bonne soirée 

 

Dow1t

Modifié par Dow1t

Partager ce message


Lien à poster
Partager sur d’autres sites

Alors

  • Serializable euh non ça n'existe pas ce mot clé
  • transient dans mes souvenirs rend le field non sérialisé, en gros si tu mets un field transient dans ta classe et que tu fous ta classe en json, il n'y aura pas ce field.
  • volatile est un truc très vague plus utilisé qui est seulement une indication, je crois ça indique qu'un field est thread-safe

Attention, moi aussi je connais pas trop ça, donc c'est peut être faux.

Partager ce message


Lien à poster
Partager sur d’autres sites

Serializable c'est une interface (pas un mot clé) qui permet de rendre une class... sérializable. (woaw)

Sérializable ça veut dire que cette classe peut être transformé en donné binaire et envoyé dans un outpustream, et lu avec un inputstream.

Ca fonctionne assez simplement: ça écrit seulement les fields (variables hors des methods), mais ils doivent eux aussi, être sérializables.

 

Transient permet d’exclure un field de la serialization. Ça peut être utile si t'es masochiste et que tu aimes bien la serialization java.

 

Volatile est utilisé en Multithreading et contrairement ce que dit Litarvan, c'est utile :P

Pour faire simple, un field qui n'est pas volatile peut être copié dans le cache du CPU puis update dans le cache partagé des processeurs mais sans garantit de quand c'est update.

Cela peut engendrer certains problèmes comme l'explique cet article.

 

Spoiler

java-volatile-2.png

 

En résumé: Pour une utilisation non masochiste de Java tu n'as pas besoin de Serialization, et si tu utilises que un processeur tu n'as pas besoin de multithreading.

À première vu, même Litarvan connait pas ces choses x)

(d'ailleurs pour le multithreading ça m'étonne, hein Litarvan :P)

3 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites

Comme ça a déjà été dit, Serializable est une interface -> regarde le tutoriel d'oracle sur la serialization

 

transient permet d'exclure un attribut de la serialization. En fait c'est très utile (coucou @SkyBeast ^_^): imagine tu fais tout un tas de calcul en fonction de données et des paramètres entrés par l'utilisateur. Et bien tu veux stocker les données (qui sont toujours les mêmes) mais pas le résultat des calculs ! Et encore moins un éventuel cache. Une solution est donc de déclarer tes attributs résultat et cache comme étant transient.

 

native sert à indiquer qu'une méthode est implémentée non pas en Java mais avec du code natif (comme du C) via JNI

Par exemple System.arraycopy est une méthode native.

 

volatile est utilisé en programmation "concurrente" ou "multi-thread", donc quand on fait potentiellement plusieurs choses en même temps sur des coeurs (de CPU) différents. Je met potentiellement parce que, même si un code est prévu pour ça, in fine c'est l'OS qui décide de ce qui tourne réellement sur les coeurs. De plus sur une machine avec un seul coeur (et sans hyper-threading, pour faire simple) ben le programme ne pourra pas faire plusieurs choses simultanément ;)

 

Pour expliquer ce qu'est volatile il faut parler des threads et de cache. Un Thread est une unité d'exécution à l'intérieur d'un programme. Un programme peut démarrer plusieurs threads, et ces derniers ont la capacité de s'exécuter en parallèle. C'est ce qui permet de distribuer le travail sur les coeurs du CPU.

 

Ce qu'il faut comprendre c'est que, quand il y a plusieurs threads qui utilisent la même variable, chaque thread a le droit de "mettre en cache" cette variable. Et du coup on a un problème : si un thread modifie la variable, les autres n'ont aucune garantie de voir cette modification, et ils peuvent donc continuer à utiliser une valeur obsolète de la variable !

Le plus vicieux, c'est que comme on n'a vraiment aucune garantie, la modification peut être vue tout de suite, ou une minute plus tard, ou 2 jours plus tard, ou jamais ! On ne peut pas savoir et ça peut varier d'une exécution à l'autre.

 

Ce là que volatile fait son entrée : si une variable est volatile, alors les threads sont forcés d'utiliser la valeur la plus à jour, la dernière valeur qui lui a été assignée.

Un exemple d'utilisation est pour arrêter un thread de façon non-brutale :

public WorkThread extends Thread {
    private volatile boolean run = true;
	
    /** Arrête le thread.*/
    public void stopWorking() {
        run = false;
    }

    @Override
    public void run() {
        while(run) {
            //continue le travail
        }
    }
}

Si run n'était pas volatile, alors la méthode stopWorking ne fonctionnerait pas correctement !

 

:excl:ATTENTION:excl: volatile ne permet pas de faire de la synchronization comme le mot-clé synchronized ou les verrous ! Il ne permet pas non plus de faire des opérations de calcul atomiques comme AtomicInteger. Notamment, volatile ne permet pas de gérer correctement un compteur incrémenté depuis plusieurs threads.*

 

* volatile ne permet pas ça à lui tout seul. Mais avec quelques ingénieuses astuces on peut faire des choses qui fonctionnent de façon sûre en multi-threading sans utiliser ni verrous ni blocs synchronized :) Par exemple AtomicInteger utilise un attribut volatile. Et on peut faire des files (queues) et autres collections en utilisant volatile astucieusement (mais je ne vais pas rentrer pas dans les détails ici ^^)

Modifié par TheElectronWill
4 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 11 minutes, TheElectronWill a dit :

En fait c'est très utile (coucou @SkyBeast ^_^): [...]

 

Transient n'est pas utile si tu trouves (comme 90% des développeurs Java) que la serialization java c'est horriblement horrible, et n'a pas d'autre utilité qu'instrument de torture masochiste.

 

il y a 11 minutes, TheElectronWill a dit :

[...] comme le mot-clé synchronized ou les verrous !

Tu vas tous nous tuer avec ta francisation du vocabulaire x) J'ai sérieusement ri en lisant ton message :)

Modifié par SkyBeast

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 12 minutes, SkyBeast a dit :

Transient n'est pas utile si tu trouves (comme 90% des développeurs Java) que la serialization c'est horriblement horrible, et n'a pas d'autre utilité qu'instrument de torture masochiste.

Bon, j'avoue que j'utilise pas la serialization :) Mais quand même... :D

EDIT : Une bonne utilité de transient: y'a pas que la serialization de base du JRE qui peut l'utiliser. Je l'utilise dans ma lib Night-Config ! Avec la même signification : ça empêche un attribut d'être écrit dans la config lors du mappage object -> config.

 

il y a 12 minutes, SkyBeast a dit :

Tu vas tous nous tuer avec ta francisation du vocabulaire x) J'ai sérieusement ri en lisant ton message :)

:D C'est à cause de ma prof de prog de cette année. Elle dit absolument tout en français (mais vraiment tout !) alors ça déteint sur les élèves.
Au moins j'ai pas fait de "francisisme". C'est le vocabulaire français "officiel"

Modifié par TheElectronWill
transient
2 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites

Ha merci à tous ! Ca fait du bien d'apprendre de nouvelles chose rien qu'en se promenant sur github :P

 

Je vous remercies pour vos explications :D

Partager ce message


Lien à poster
Partager sur d’autres sites

Je fais très très très peu de threading donc mes connaissances dans ce domaine sont quasi-nulles. Par contre pour la sérialization, c'est toi qui te trompes @SkyBeast. Il n'y a pas que la sérialization Java, il y a aussi l'invention de Dieu appelée le "JSON", et dans ce cas là transient est très utile :)

3 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !


Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.


Connectez-vous maintenant

  • En ligne récemment   0 membre est en ligne

    Aucun utilisateur enregistré regarde cette page.