Traitement parallèle et parallèle dans divers langages (édition Java)

Faisons la même chose en Java que la dernière fois.

long.java



public class Main {

    private static final int REPEAT = 500000000;

    private static long a = 0;

    public static void main(String[] args) throws InterruptedException{

        Thread th1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0;i <REPEAT; i++){
                    a = 1;
                    check();
                }
            }
        });

        Thread th2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0;i <REPEAT; i++){
                    a = -1;
                    check();
                }
            }
        });

        th1.start();
        th2.start();

        th1.join();
        th2.join();

        System.out.println("FINISHED!");
    }

    private static void check(){
        if(a != 1 && a != -1){
            System.out.println("LONG VALUE HAS BROKEN!");
        }
    }
}

Pas de contrôle exclusif, mais il existe un modificateur volatil pour résoudre un problème similaire en Java private volatile static long a = 0; Il n'y aura alors aucun problème.

Volatile a la propriété de "toujours regarder la dernière valeur lors du référencement d'une valeur". En gros, les affectations et références volatiles se comportent comme si elles étaient verrouillées.

Mais ce n'est pas sûr, j'utilise donc Atomic Long. Atomique: opération indivisible. Cela signifie que lors de l'exécution d'une opération, les autres ne peuvent pas interrompre l'opération. private static AtomicLong a = new AtomicLong(0)

Citation: http://d.hatena.ne.jp/cero-t/20120830/1346267076

Un bloc synchronisé peut être utilisé pour un contrôle exclusif en Java.

synchronized


public class Main {

    private static final int REPEAT = 500000000;

    private static Long a = new Long(0);

    public static void main(String[] args) throws InterruptedException{

        Thread th1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0;i <REPEAT; i++){
                    synchronized (a){
                        a = new Long(1);
                        check();
                    }
                }
            }
        });

        Thread th2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0;i <REPEAT; i++){
                    synchronized (a) {
                        a = new Long(-1);
                        check();
                    }
                }
            }
        });

        th1.start();
        th2.start();

        th1.join();
        th2.join();

        System.out.println("FINISHED!");
    }

    private static void check(){
        if(a != 1 && a != -1){
            System.out.println("LONG VALUE HAS BROKEN!");
        }
    }
}

Stream # parallel peut être utilisé pour le traitement parallèle en Java.

parallel


public class Main {

    public static void main(String[] args) {
	// write your code here
        IntStream.range(1,10).parallel().forEach(System.out::println);
    }
}

Recommended Posts

Traitement parallèle et parallèle dans divers langages (édition Java)
Traitement parallèle mesuré avec Java
Divers threads en java
Java aléatoire, divers traitements
Exécution parallèle en Java
Arguments de longueur variable dans différentes langues
Exemple d'encodage et de décodage en Java
Traitement de la date en Java (LocalDate: Initialization)
[Java] Traitement en boucle et table de quatre-vingt-dix-neuf
Classe StringBuffer et StringBuilder en Java
Comprendre equals et hashCode en Java
A propos du traitement de la copie de fichiers en Java
[Java] Types d'exception et traitement de base
Bonjour tout le monde en Java et Gradle
Structure de l'application Web par Java et flux de traitement dans la couche de présentation
Différence entre final et immuable en Java
Diverses choses comme les indicateurs de bits en Java
Résumé des classes racine dans différentes langues
Différence entre les listes d'arry et les listes liées en Java
Programmer les en-têtes et pieds de page PDF en Java
Apprenez les modèles Flyweight et ConcurrentHashMap en Java
La direction de Java dans "C ++ Design and Evolution"
De Java à C et de C à Java dans Android Studio
Lire et écrire des fichiers gzip en Java
Différence entre int et Integer en Java
Discrimination d'énum dans Java 7 et supérieur
NLP4J [004] Essayez l'analyse de texte en utilisant le traitement du langage naturel et le traitement statistique de l'analyse syntaxique en Java
[Java] Différentes méthodes pour acquérir la valeur stockée dans List par traitement itératif
NLP4J [003] Essayez l'analyse de texte en utilisant le traitement du langage naturel et le traitement statistique des pièces en Java
Enum et annotations du chapitre 6 de Java 3rd Edition efficace
Concernant les modificateurs transitoires et la sérialisation en Java
Détecter des vidéos similaires dans Java et OpenCV rev.2
Vulnérabilités et contre-mesures dans le traitement important (traitement des achats) (CSRF)
Efficacité de Java 3rd Edition Chapitre 4 Classes et interfaces
Différence entre next () et nextLine () dans Java Scanner
Différences dans l'écriture des classes Java, C # et Javascript
Organisation des notes dans la tête (Java - édition d'instance)
Efficace Java 3e édition Chapitre 7 Lambda et Stream
[Traitement × Java] Type de données et programmation orientée objet
JAVA: réalise la génération et la numérisation de divers types de codes à barres
Capture et sauvegarde de l'installation de sélénium en Java
Détecter des vidéos similaires dans Java et OpenCV rev.3
Ajouter, lire et supprimer des commentaires Excel à l'aide de Java
Vérifier le comportement statique et public dans les méthodes Java
[Java] Comprenez en 10 minutes! Tableau associatif et HashMap
Présentation de NLP4J- [000] Natural Language Processing Index en Java
Distinguer les nombres positifs et négatifs en Java
Java ajoute et supprime les filigranes dans les documents Word
Détecter des vidéos similaires dans Java et OpenCV rev.1
Représente le «jour suivant» et le «jour précédent» en Java / Android
Questions sur la gestion des exceptions Java throw et try-catch
Télécharger et télécharger des notes en java sur S3
Crypter / décrypter avec AES256 en PHP et Java
Générer OffsetDateTime à partir de Clock et LocalDateTime en Java
Partition en Java
Flux et flux parallèle
[Java] Comment obtenir la clé et la valeur stockées dans Map par traitement itératif
Changements dans Java 11