Questions d'entrevue Java - Points de connaissance communs de ArrayList

Écrit avant

Il existe de nombreuses questions d'entretien pour ArrayList sur Internet, mais la plupart partent de la structure de données d'ArrayList, comme l'analyse des problèmes d'efficacité tels que la recherche et la modification. Cet article souhaite partir du point de vue de la concurrence et vous dire comment pour répondre au problème de concurrence de ArrayList.

Revue d'entrevue

En règle générale, les problèmes tels que les conteneurs sont plus élémentaires car ils sont généralement étudiés d'un côté, ce qui est également devenu un facteur clé pour déterminer s'il faut entrer des deux côtés.

Interviewer: Je pense que vous pouvez maîtriser les bases de Java sur votre CV. Quels conteneurs avez-vous utilisés?

Moi: Bonjour, intervieweur. ArrayList, LinkedList, HashSet, hashMap, etc. sont couramment utilisés dans le travail général.

Interviewer: Sont-ils tous thread-safe?

Moi: Ce n'est pas thread-safe, ils auront des problèmes de thread-safety dans des situations de haute concurrence.

Interviewer: Pouvez-vous écrire un programme pour parler brièvement des problèmes avec ArrayList?

Bien sûr, à ce moment, vous devez trouver le programme que vous accumulez habituellement.

JE:

Comme suit: ouvrez 20 threads, chaque thread génère un nombre aléatoire et ajoute le nombre aléatoire au conteneur de liste

public class ArrayListUnsafe {
    public static void main(String[] args) {
        List<String> lists = new ArrayList <>();
        for (int i = 0; i < 20; i++) {
            new Thread(()->{
                lists.add(UUID.randomUUID().toString().substring(0,5));
                System.out.println(lists);
            },String.valueOf(i)).start();
        }
    }
}

Dans des circonstances normales, ce programme signalera java.util.ConcurrentModificationException, qui est également une erreur courante dans les situations de forte concurrence, exception de modification simultanée

Interviewer: Pourquoi ce problème se produit-il?

Moi: En multithreading, chaque fois que vous écrivez des données dans le conteneur, l'ordre n'est pas garanti. Quiconque anticipe le conteneur commence à écrire les données. Par conséquent, il peut y avoir une situation d'écrasement, entraînant des résultats incohérents à chaque fois.

Interviewer: Y a-t-il un moyen d'éviter ce problème?

Moi: Maintenant, jdk fournit une variété de moyens pour assurer la sécurité des threads de List.

Utilisez la classe de collection Vector traditionnelle. Mais cette classe ajoute le mot clé Synchronize à la méthode pour garantir la sécurité des threads. Mais jdK n'est plus recommandé, car la méthode de verrouillage lourde est utilisée, ce qui entraîne une faible efficacité d'exécution.
Utilisez des outils, Collections.synchronizedList pour garantir la sécurité des threads. Par exemple,
List lists = Collections.synchronizedList (new ArrayList <> ());
Utilisez la classe de collection copie sur écriture. CopyOnWriteArrayList
peut dire copie sur écriture, qui est un élément bonus, étudiants! !

Interviewer: Pouvez-vous parler brièvement de ce qu'est CopyOnWriteArrayList?

Moi: la copie sur écriture est similaire à la séparation du processus de lecture et d'écriture des données. tel que

Un thread et un thread B commencent tous les deux à écrire des données. Chaque fois que A et B écrivent des données, ils doivent obtenir une licence (semblable à un verrou). Les données de la mémoire principale sont copiées dans la mémoire de travail, puis modifiées. Après la la modification est terminée Pointez la référence du conteneur vers le nouvel ensemble de données, puis autorisez d'autres threads à le modifier.

Code source

Par exemple, pour la méthode add () de copie en écriture, le code source jdk est le suivant:

public boolean add(E e) {
    // 先获取锁,也就是前文说的许可证
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        Object[] elements = getArray();
        int len = elements.length;
        // 将原数组复制一份
        Object[] newElements = Arrays.copyOf(elements, len + 1);
        // 添加新值
        newElements[len] = e;
        // 将数组索引指向新数组
        setArray(newElements);
        return true;
    } finally {
        // 最后释放锁
        lock.unlock();
    }
}

Chaque fois qu'un élément est ajouté, le verrou (c'est-à-dire l'autorisation) est d'abord acquis, puis l'élément est mis à jour.

Répondant à ce niveau, la question de ArrayList est considérée comme une meilleure réponse. Si vous pouvez répondre à chaque question d'un côté, pourquoi et comment le faire, ce sera une évidence d'entrer dans le second côté.

Interviewer: D'accord, c'est tout pour l'interview d'aujourd'hui. Quand aurez-vous le temps pour la prochaine interview? Laissez-moi l'organiser.

Hahaha, félicitations, l'interview a été gagnée avec succès ici, préparez-vous joyeusement pour les deux parties

Moi: j'ai le temps ces jours-ci, selon vos arrangements.

Pour résumer

Il existe de nombreux blogs décrivant le problème des conteneurs. Si la structure de données sous-jacente d'ArrayList vous intéresse, vous pouvez la rechercher vous-même. Cet article analyse principalement les questions d'entrevue ArrayList du point de vue de la sécurité des threads, et comment y répondre en général.

Enfin, je partagerai mon expérience d'entrevue pendant de nombreuses années. Lors de l'entretien, vous pouvez répondre à une question selon la logique du score total. Commencez par lancer la conclusion directement, puis montrez votre conclusion avec des exemples. Assurez-vous de saisir le cœur de l'intervieweur pour la première fois, sinon il est facile de donner aux gens l'impression de ne pas pouvoir saisir la clé ou le marginal.

Je suppose que tu aimes

Origine blog.csdn.net/doubututou/article/details/112315548
conseillé
Classement