Inhaltsverzeichnis
Frageninhalt
Lösung
Heim Backend-Entwicklung Golang Ist das Ersetzen einer zugeordneten Variablen durch einen neuen zugeordneten Objektthread sicher?

Ist das Ersetzen einer zugeordneten Variablen durch einen neuen zugeordneten Objektthread sicher?

Feb 10, 2024 pm 04:33 PM
并发访问 键值对

Ist das Ersetzen einer zugeordneten Variablen durch einen neuen zugeordneten Objektthread sicher?

PHP-Editor Apple ist hier, um eine häufig gestellte Frage zu beantworten: „Ist es threadsicher, eine Mapping-Variable durch ein neues Mapping-Objekt zu ersetzen?“ Eine Mapping-Variable ist eine allgemeine Datenstruktur, die zum Speichern von Schlüssel-Wert-Paaren verwendet wird. In einer Multithread-Umgebung ist die Thread-Sicherheit ein wichtiger Gesichtspunkt. Obwohl die Verwendung eines neuen Zuordnungsobjekts das Problem des gleichzeitigen Zugriffs vermeiden kann, muss die Thread-Sicherheit immer noch von Fall zu Fall beurteilt werden. Als nächstes werden wir dieses Problem eingehend untersuchen, um den Lesern zu helfen, die Beziehung zwischen Thread-Sicherheit und zugeordneten Objekten besser zu verstehen.

Frageninhalt

Ich glaube nicht, dass es Thread-sicher ist, da das zugeordnete Objekt größer als Maschinenwörter ist und Golang nicht garantiert, dass es Thread-sicher ist. Aber wenn ich den Democode mit go run -race main.go ausführe, wird nie ein Fehler gemeldet. Dies kann der Grund sein, warum Threadsanitizer auf Laufzeitprüfungen und Zuweisungsvorgänge angewiesen ist, um die Erfüllung unsicherer Thread-Bedingungen zu erschweren.

Hier ist der Beispielcode:

package main

import (
    "fmt"
)

var m = make(map[int]bool)

func Read() {
    for {
        for k := range m {
            fmt.Println(k)
        }
    }
}

func Replace() {
    for {
        newM := make(map[int]bool, 10)
        for i := 0; i < 10; i++ {
            newM[i] = false
        }
        m = newM
    }
}

func main() {
    c := make(chan struct{})

    go Read()
    go Replace()

    <-c
}

Nach dem Login kopieren

Wie ändere ich den Code, um Parallelitätsfehler auszulösen? Oder irre ich mich vielleicht und der Code ist Thread-sicher?

Lösung

Hier sind ein paar Punkte zu beachten:

for k := range m {
Nach dem Login kopieren

Range-Ausdrücke werden einmal am Anfang der for-Schleife ausgewertet. Diese Operation lautet also m 一次(注意,这意味着如果循环中的代码重新分配 m ,则循环将继续迭代原始 m ,但是如果添加新元素或从 m 中删除元素,这些将被检测到循环),循环本身会调用 fmt.println , was die meiste Ausführungszeit in dieser Goroutine in Anspruch nimmt. Wenn Sie das Spiel nachholen möchten, löschen Sie es.

Zweitens müssen Sie die zweite Karte nicht wirklich initialisieren.

Wenn Sie dies tun und den Renndetektor ausführen, kann es sein, dass Datenrennen erfasst werden. Soweit es mich betrifft, ist es so.

Der Konfliktdetektor meldet einen Konflikt, wenn er ihn erkennt. Wenn also eine Übereinstimmung gemeldet wird, liegt eine Übereinstimmung vor. Wenn es nicht gemeldet wird, heißt das nicht, dass es keinen Wettbewerb gibt.

Auf meiner Plattform hat die Map-Variable selbst tatsächlich die gleiche Größe wie ein Maschinenwort: Sie ist nur ein Zeiger auf die abgebildete Struktur. Daher sind Schreibvorgänge in zugeordnete Variablen effektiv atomar, d. h. Sie werden auf dieser Plattform keine teilweise zugewiesenen Zuordnungen sehen. Dies verhindert jedoch keinen Konflikt, da es keine Garantie dafür gibt, wann andere Goroutinen diesen Speicherschreibvorgang sehen.

Kurz gesagt, es ist ein Wettbewerb. Dies liegt nicht an der Größe der Kartenvariablen. Um dies zu beheben, verwenden Sie einen Mutex.

Das obige ist der detaillierte Inhalt vonIst das Ersetzen einer zugeordneten Variablen durch einen neuen zugeordneten Objektthread sicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Java-Datenstrukturen und -Algorithmen: ausführliche Erklärung Java-Datenstrukturen und -Algorithmen: ausführliche Erklärung May 08, 2024 pm 10:12 PM

Datenstrukturen und Algorithmen sind die Grundlage der Java-Entwicklung. In diesem Artikel werden die wichtigsten Datenstrukturen (wie Arrays, verknüpfte Listen, Bäume usw.) und Algorithmen (wie Sortier-, Such-, Diagrammalgorithmen usw.) ausführlich untersucht. Diese Strukturen werden anhand praktischer Beispiele veranschaulicht, darunter die Verwendung von Arrays zum Speichern von Bewertungen, verknüpfte Listen zum Verwalten von Einkaufslisten, Stapel zum Implementieren von Rekursionen, Warteschlangen zum Synchronisieren von Threads sowie Bäume und Hash-Tabellen für schnelle Suche und Authentifizierung. Wenn Sie diese Konzepte verstehen, können Sie effizienten und wartbaren Java-Code schreiben.

So lösen Sie das Problem vielbeschäftigter Server für Deepseek So lösen Sie das Problem vielbeschäftigter Server für Deepseek Mar 12, 2025 pm 01:39 PM

Deepseek: Wie kann man mit der beliebten KI umgehen, die von Servern überlastet ist? Als heiße KI im Jahr 2025 ist Deepseek frei und Open Source und hat eine Leistung, die mit der offiziellen Version von OpenAio1 vergleichbar ist, die seine Popularität zeigt. Eine hohe Parallelität bringt jedoch auch das Problem der Serververantwortung. Dieser Artikel wird die Gründe analysieren und Bewältigungsstrategien bereitstellen. Eingang der Deepseek -Webversion: https://www.deepseek.com/deepseek Server Beschäftigter Grund: Hoher Zugriff: Deepseeks kostenlose und leistungsstarke Funktionen ziehen eine große Anzahl von Benutzern an, die gleichzeitig verwendet werden können, was zu einer übermäßigen Last von Server führt. Cyber ​​-Angriff: Es wird berichtet, dass Deepseek Auswirkungen auf die US -Finanzbranche hat.

Java-Datenstrukturen und -Algorithmen: Ein praktischer Leitfaden zum Cloud Computing Java-Datenstrukturen und -Algorithmen: Ein praktischer Leitfaden zum Cloud Computing May 09, 2024 am 08:12 AM

Der Einsatz von Datenstrukturen und Algorithmen ist im Cloud Computing von entscheidender Bedeutung, um riesige Datenmengen zu verwalten und zu verarbeiten. Zu den gängigen Datenstrukturen gehören Arrays, Listen, Hash-Tabellen, Bäume und Diagramme. Zu den häufig verwendeten Algorithmen gehören Sortieralgorithmen, Suchalgorithmen und Diagrammalgorithmen. Mithilfe der Leistungsfähigkeit von Java können Entwickler Java-Sammlungen, threadsichere Datenstrukturen und Apache-Commons-Sammlungen verwenden, um diese Datenstrukturen und Algorithmen zu implementieren.

Wie gehe ich mit Rennbedingungen und Rennbedingungen in der gleichzeitigen Java-Programmierung um? Wie gehe ich mit Rennbedingungen und Rennbedingungen in der gleichzeitigen Java-Programmierung um? May 08, 2024 pm 04:33 PM

Bei der gleichzeitigen Programmierung in Java können Race Conditions und Race Conditions zu unvorhersehbarem Verhalten führen. Eine Race-Bedingung tritt auf, wenn mehrere Threads gleichzeitig auf gemeinsam genutzte Daten zugreifen, was zu inkonsistenten Datenzuständen führt, die durch die Verwendung von Sperren zur Synchronisierung behoben werden können. Eine Race-Bedingung liegt vor, wenn mehrere Threads denselben kritischen Teil des Codes gleichzeitig ausführen, was zu unerwarteten Ergebnissen führt. Atomare Operationen können durch die Verwendung atomarer Variablen oder Sperren sichergestellt werden.

Welche Anwendungsbeispiele gibt es für die Template-Programmierung in verschiedenen Bereichen? Welche Anwendungsbeispiele gibt es für die Template-Programmierung in verschiedenen Bereichen? May 08, 2024 pm 05:42 PM

Vorlagenprogrammierung ist ein Paradigma für die Erstellung flexiblen, wiederverwendbaren Codes, der in Bereichen wie Datenstrukturen, Containerbibliotheken, Metaprogrammierung und Grafikbibliotheken weit verbreitet ist. Konkrete Beispiele sind dynamische Arrays, Hash-Tabellen, Prioritätswarteschlangen, Typlöschung und Vertex-Shader.

Was bedeutet Rowid in Orakel? Was bedeutet Rowid in Orakel? May 08, 2024 pm 06:09 PM

ROWID ist eine Kennung, die eine Zeile in der Oracle-Datenbank eindeutig identifiziert und aus Dateinummer, Bereichsnummer, Blocknummer und Slotnummer besteht. Es wird verwendet, um die Datenintegrität sicherzustellen, die Abfrageleistung zu verbessern und spielt eine Rolle bei Replikations- und Wiederherstellungsvorgängen. Sie können die ROWID über die Anweisung SELECT ROWID abrufen und beim Aktualisieren, Löschen, Erstellen eines Index oder Kopieren und Wiederherstellen verwenden. Beachten Sie, dass ROWID innerhalb einer Tabelle eindeutig ist, in verschiedenen Tabellen jedoch gleich sein kann und sich ändern kann, wenn sich die Tabellenstruktur ändert.

Wie ist die Methode, um Vue.js -Zeichenfolgen in Objekte umzuwandeln? Wie ist die Methode, um Vue.js -Zeichenfolgen in Objekte umzuwandeln? Apr 07, 2025 pm 09:18 PM

Die Verwendung von JSON.Parse () String to Object ist am sichersten und effizientesten: Stellen Sie sicher, dass die Zeichenfolgen den JSON -Spezifikationen entsprechen, und vermeiden Sie häufige Fehler. Verwenden Sie Try ... Fang, um Ausnahmen zu bewältigen, um die Code -Robustheit zu verbessern. Vermeiden Sie die Verwendung der Methode EVAL (), die Sicherheitsrisiken aufweist. Für riesige JSON -Saiten kann die Analyse oder eine asynchrone Parsen in Betracht gezogen werden, um die Leistung zu optimieren.

See all articles