Java mécanisme de synchronisation de fil

  1. Contexte
    Exemple: Création d' une fenêtre pour vendre des billets, le nombre total de voix pour les 100 qui mettent en œuvre de façon interface Runnable

1. Problème: le processus de vente des billets, il y a eu vote lourd, mauvais vote -> il y a eu des problèmes de sécurité fil
2. Les causes du problème: quand un processus de fil des opérations de billets, une fois terminé, l'opération n'a pas été impliqué dans d' autres discussions venir, exploite également un billet.
3. Comment fixer: Quand un thread un billet au moment de l'opération, d' autres threads ne peuvent pas participer. Lorsqu'un thread que l'opération soit complète ticket, les autres threads peuvent commencer billets d'opération. Ce produit même enfilez un bloqué et ne peut être modifié.

  1. Java Solution: mécanismes de synchronisation

En Java, nous avons passé mécanisme de synchronisation à l'adresse fil des questions de sécurité.

//方式一:同步代码块

  synchronized(同步监视器){
      //需要被同步的代码

   }

Description:

  • 1. Le code d'opération des données partagées, le code qui doit être synchronisé. -> ne peut pas contenir du code pour plus, et ne peut pas contenir moins de code.
  • 2. Les données partagées: variable plusieurs threads coopération. Par exemple: billet est le partage des données.

  • 3. Synchronisez moniteur, communément connu sous le nom: serrure. Tout objet d'une classe, peut agir comme un verrou.

     要求:多个线程必须要共用同一把锁。
    

Ajouté: Dans la mise en œuvre Runnable créer plusieurs threads, on peut considérer cet acte comme moniteurs de synchronisation.
l' héritage de fil de classe pour créer le mode multi-thread, cela agit comme un moniteur de synchronisation utilisés avec prudence, compte tenu de l'acte de classe actuelle comme moniteurs de synchronisation.

Deuxième moyen: la méthode de synchronisation
si les données de partage de code dans un mode de fonctionnement complet de déclaration, nous pourrions aussi bien déclarer cette méthode synchronisée.

A propos de la méthode de synchronisation Résumé:

  1. Méthode de synchronisation implique encore la synchronisation de l'écran, mais on n'a pas besoin de déclarer explicitement.
  2. Procédé non-statique de synchronisation est moniteur de synchronisation: la présente
    méthode statique de synchronisation est moniteur de synchronisation: la classe courante elle-même

Trois façons: Vous pouvez verrouiller - JDK5.0 nouvelles

  1. Interview Questions: synchronisée et verrouillage des similitudes et des différences?
  • Le même: les deux peuvent résoudre les problèmes de sécurité de fil
  • Différents mécanismes: synchronisés été effectuées après le code de synchronisation correspondant, moniteur de synchronisation libérer automatiquement
  • Verrouillez la nécessité de démarrer manuellement la synchronisation (verrouillage (), en même temps aussi besoin de synchroniser manuellement la fin de la mise en œuvre (déverrouillage ())

Utilisation de priorité:
Lock -> bloc de synchronisation (a pénétré dans le corps de la méthode d'attribution de la ressource correspondante) ->  procédé de synchronisation (méthode à l' extérieur du corps)

  1. Avantages et inconvénients d'
    une manière synchronisée pour résoudre le problème du fil de sécurité. - Avantages
    code de synchronisation d' exploitation, ne peut participer à un fil, d' autres threads attendent. L'équivalent d'un processus mono-thread est inefficace.

  2. Interview Questions: Java est de savoir comment résoudre les problèmes de sécurité du fil, il existe plusieurs façons? Et comparer les différentes façons de

Contraste de façon synchronisée et thread-safe Lock pour résoudre le problème: les questions de visage


Thread - safe Singleton - homme paresseux à l'
aide d' un seul mécanisme de synchronisation en mode de réalisation réécrite sécurité de fil paresseux.

class Bank{

    private Bank(){}

    private static Bank instance = null;

    public static Bank getInstance(){
        //方式一:效率稍差
//        synchronized (Bank.class) {
//            if(instance == null){
//
//                instance = new Bank();
//            }
//            return instance;
//        }
        //方式二:效率更高
        if(instance == null){

            synchronized (Bank.class) {
                if(instance == null){

                    instance = new Bank();
                }

            }
        }
        return instance;
    }

}

Interview questions: écrire un singleton thread-safe.
Hungry style homme.
Lazy formule: fournis ci - dessus.


IMPASSE
1. impasse comprennent :
différents threads sont occupés par d' autres ressources nécessaires pour synchroniser ne pas abandonner, attendent l'autre pour donner des ressources de synchronisation dont ils ont besoin pour former un blocage de fil

2. Description de :

  • 1 Après l'impasse, ne semble pas anormal, rapide ne semble pas, mais les fils sont à l'état bloqué ne peut pas continuer
  • 2 Nous utilisons la synchronisation pour éviter une impasse.

3. Par exemple :

public static void main(String[] args) {

    StringBuffer s1 = new StringBuffer();
    StringBuffer s2 = new StringBuffer();


    new Thread(){
        @Override
        public void run() {

            synchronized (s1){

                s1.append("a");
                s2.append("1");

                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }


                synchronized (s2){
                    s1.append("b");
                    s2.append("2");

                    System.out.println(s1);
                    System.out.println(s2);
                }


            }

        }
    }.start();


    new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (s2){

                s1.append("c");
                s2.append("3");

                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                synchronized (s1){
                    s1.append("d");
                    s2.append("4");

                    System.out.println(s1);
                    System.out.println(s2);
                }


            }



        }
    }).start();


}
Publié 73 articles originaux · louanges gagnées 0 · Vues 1238

Je suppose que tu aimes

Origine blog.csdn.net/qq_38605145/article/details/105105678
conseillé
Classement