Je viens de regarder aujourd'hui la programmation simultanée pratique sur la libération et l'accès sécurisés aux objets mutables : Libération sécurisée :
Initialiser une référence d'objet dans une fonction d'initialisation statique
Enregistrer la référence de l'objet sur volatile ou AtomicReference
Enregistrer la référence de l'objet à un type final qui construit correctement l'objet
Enregistrez l'objet dans le cadre d'un verrou.
Accès sécurisé :
Discussion fermée
Partage en lecture seule
Partage thread-safe, la méthode d'accès interne de l'objet publié est thread-safe, et aucune synchronisation externe n'est requise
Protégez les objets, publiez des objets mutables en limitant l'accès externe et spécifiez l'interface d'accès aux objets mutables.
static List<String> arrayList = new ArrayList<>();Cela est conforme à la première règle de publication sécurisée Ensuite, nous devons garantir un accès sécurisé Puisque la liste ne doit pas être accessible en toute sécurité dans les trois premières situations, nous ne pouvons compter que sur la restriction du monde extérieur lorsque. publier des objets, c'est-à-dire verrouiller.
Cela peut être réalisé selon la demande du sujet, mais la réalisation de cette demande est très étrange.
private static void test1(final int i) {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (arrayList) {
while (arrayList.size() != i) {
try {
arrayList.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
arrayList.add(i, i + "position");
arrayList.notifyAll();
}
}
}).start();
}
En plus de cette méthode, cela peut également être réalisé par join et en passant countdownlatch Si vous voulez vraiment être comme le sujet, il vaut mieux ne pas utiliser le multi-threading
Utiliser des
synchronized
mots-clésAjouter le mot-clé volatile à la liste
Je viens de regarder aujourd'hui la programmation simultanée pratique sur la libération et l'accès sécurisés aux objets mutables :
Libération sécurisée :
Initialiser une référence d'objet dans une fonction d'initialisation statique
Enregistrer la référence de l'objet sur volatile ou AtomicReference
Enregistrer la référence de l'objet à un type final qui construit correctement l'objet
Enregistrez l'objet dans le cadre d'un verrou.
Accès sécurisé :
Discussion fermée
Partage en lecture seule
Partage thread-safe, la méthode d'accès interne de l'objet publié est thread-safe, et aucune synchronisation externe n'est requise
Protégez les objets, publiez des objets mutables en limitant l'accès externe et spécifiez l'interface d'accès aux objets mutables.
static List<String> arrayList = new ArrayList<>();
Cela est conforme à la première règle de publication sécuriséeEnsuite, nous devons garantir un accès sécurisé Puisque la liste ne doit pas être accessible en toute sécurité dans les trois premières situations, nous ne pouvons compter que sur la restriction du monde extérieur lorsque. publier des objets, c'est-à-dire verrouiller.
Cela peut être réalisé selon la demande du sujet, mais la réalisation de cette demande est très étrange.
En plus de cette méthode, cela peut également être réalisé par
.join
et en passantcountdownlatch
Si vous voulez vraiment être comme le sujet, il vaut mieux ne pas utiliser le multi-threadingL'utilisation de la méthode InvokeAll du pool de threads peut garantir que l'ordre des résultats est cohérent avec l'ordre des paramètres transmis