9
votes

Différence dans l'aspect multi-thread entre Java et / C ++

J'ai lu quelques conseils que la mise en œuvre multithread dépend en grande partie du système d'exploitation ciblé sur lequel vous travaillez. Et le système d'exploitation fournit enfin la capacité multithread. Tel que Linux a la mise en œuvre standard de POSIX et Windows32 a une autre solution.

Mais je veux connaître le majeur différent du niveau de langage de programmation. C semble fournir plus de choix pour la synchronisation telle que le mutex, les serrures en lecture-écriture, le verrouillage des enregistrements, les sémaphores POSIX.

mais en Java, je sais que nous pouvons utiliser des œuvres synchronisées comme Mutex? Et une autre API de haut niveau comme Atomicxx et volatile. Mais je n'ai rien trouvé comme des serrures de verrouillage d'enregistrement et de lecture-écriture. Est-ce un côté faible de la langue Java? Ou c'est un sacrifice pour la plate-forme de croisement?

En outre, je veux savoir est-ce une raison majeure que le serveur Web comme Nginx et DB comme Oracle sont tous écrits en C / C ++?

Je suis en fait un développeur Java et je suis très curieux de ça. J'espère que quelqu'un peut me donner des conseils à ce sujet.

EDIT:

Paul et Jesper ont déjà conseillé que Java prend en charge toute la classe de verrouillage similaire comme C / C ++ après JDK1.5. Mais si possible, je souhaite toujours que quelqu'un puisse expliquer plus de détails pourquoi Java fournit suffisamment de support, nous ne pouvons toujours pas trouver un "oracle" pur Java.

EDIT: < P> En outre, je veux ajouter quelque chose d'intéressant j'ai appris de développeur.com de Nasir Khan. Comprendre Java Multhreading et Lecture-Ecrire des verrous .

Un sujet de sujet.

  • L'interaction de la principale commune mémoire avec la locale du fil Mémoire,
  • la signification de "synchronisation" En ce qui concerne cette interaction et exclusion mutuelle.
  • clarifier la distinction d'un Verrou de l'objet et les ressources informatiques des gardes.

    Edit:

    de Filelock Javadocs

    Les serrures de fichier sont conservées pour le compte de l'ensemble de la machine virtuelle Java. Ils ne conviennent pas à la commande d'accès à un fichier par plusieurs threads dans la même machine virtuelle.

    verrouillage de fichier en Java est exactement aussi identique qu'en C / C ++.

    Mise à jour
    Je trouve une autre zone intéressante à comparer qui est
    en C ++, il y a quelque chose comme xxx

    en java, nous avons aussi atomicinteger . Sont-ils la même chose?


0 commentaires

3 Réponses :


4
votes

Java fournit des serrures en lecture-écriture - http://download.oracle.com/javase/6/docs/api/java/util/concurrent/locks/readwritelock.html .

Regardez le package Java.Util.ContCurrent si vous ne l'avez pas déjà fait. Je soupçonne que le soutien de Java est comparable à C. Il existe également un certain nombre de serveurs Web écrits en Java qui utilisent des multithreads ou ASYNC IO (NIO).


8 commentaires

Que diriez-vous de verrouillage d'enregistrement et de sémaphores que j'ai mentionné?


Pourriez-vous également fournir un projet open source qui utilise cette readwitelock? Donc, je peux jeter un oeil à celui-ci. Merci!


@Clark aperçu de l'API DOCS DE JAVA.UTIL.CONCURRENT AS Paul suggère - Oui, Java dispose d'une classe SEMAPHORE et de nombreuses autres classes de contrôle de la concurrence. , y compris de nombreuses classes de collecte spécialisées.


Oui, il existe un certain nombre de serveurs Web en Java. Mais que diriez-vous de la base de données? Vous pouvez surtout nommer un serveur Web similiaire comme Nginx dans son domaine spécifique?


@Clark: Il y a sont des systèmes de base de données écrites en Java (Apache Derby, HSQLDB, etc.), bien qu'ils ont tendance pas être les leaders du marché. Pour le verrouillage de l'enregistrement, vous voulez dire le type de verrouillage de fichier fourni par télécharger.oracle.com/javase/6/docs/api/java/nio/channel/... ?


@Paul aussi loin que je sais que H2 ne fournit pas de capacité parallèle. Pas sûr de Derby.


@Paul tu es super! Je devrais vous remercier et accepter votre réponse! Mais pourquoi Filelock n'est pas dans un package simultané.A bit étrange.


@Clark Bao Le verrouillage des fichiers est destiné au verrouillage de l'enregistrement que vous avez demandé. Ils ont été ajoutés avec java.nio.channels à JDK 1.4. Java.Util.ConCurrent a été ajouté en 1.5.



1
votes

Je crois que Java a le verrou que vous avez mentionné.

http: //download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/package-summary.html

Et je recommande le livre Java simultanéency dans la pratique si vous êtes intéressé par ce sujet.


0 commentaires

6
votes

Java est un niveau légèrement supérieur à C / C ++ dans la plupart des aspects, principalement en raison de l'abstraction que la JVM fournit. Ainsi, il est moins efficace et plus loin du système d'exploitation.

Les méthodes synchronisées en sont un exemple de ceci, la mise en œuvre peut utiliser différents mécanismes en fonction du système d'exploitation sous-jacent.

Du fait que cette efficacité plus faible C / C ++ est préférée pour certaines tâches où l'efficacité est très importante, comme celles que vous mentionnez.

Je considérerais que (abstraction due à la JVM et donc de niveau supérieur) comme la raison principale et la source de différences entre C / C ++ et Java, en raison de la manière dont les threads sont manipulés et d'autres différences, juste des aspects ou des conséquences de cette principale différence. < / p>

spécifiquement sur lire- Ecrire des verrous , Java fournit les outils pour les utiliser (comme indiqué dans les commentaires précédents), et probablement une méthode de synchronisation que vous souhaiteriez pouvoir utiliser est disponible ou mise en œuvre en Java d'une manière ou d'une autre. Comment la JVM traduit ceci aux appels OS et l'efficacité du résultat est une question différente.


3 commentaires

"Comment la JVM traduit cela aux appels OS et l'efficacité du résultat est une question différente." C'est vraiment une bonne question


Cela dépend du système d'exploitation, mais je suppose que les développeurs prendraient la traduction la plus simple disponible, ce qui serait la plus simple à mettre en œuvre et à exécuter.


~ " moins efficace ". Comment est-ce mesuré?