/ / wie man eine thread-sichere Zeilenmatrix in Java erstellt - Java, Multithreading, Matrix, Thread-Sicherheit

So erstellen Sie eine Thread-sichere Zeilenmatrix in Java - Java, Multithreading, Matrix, Thread-Sicherheit

Ich habe ein Problem: Ich habe eine Struktur, die eine Matrix von int darstellt. Ich muss eine Operation in einer einzelnen Zeile dieser Matrix ausführen und diese Operationen müssen threadsicher sein. Ich dachte daran, die gesamte Matrix zu sperren, aber ich möchte nur die einzelne Zeile sperren. Wie kann ich das machen??? Vielen Dank

Antworten:

3 für die Antwort № 1

Java unterstützt eigentlich keine mehrdimensionalen Arrays. Ein 2D-Array ist einfach ein Array von Arrays.

Daher können Sie in einer einzelnen Zeile synchronisieren:

synchronized(matrix[row_index]) {
// do stuff with matrix[row_index] here
}

Dies setzt voraus, dass kein anderer Code neu zugewiesen wird matrix[row] (das Array selbst, nicht die Elemente); Wenn dies der Fall ist, benötigen Sie eine temporäre Variable, um die Racebedingung zu vermeiden, bei der ein anderer Thread sie in der Mitte Ihres Threads neu zuweisen könnte synchronized Block:

int[] the_row = matrix[row_index];
synchronized(the_row) {
// do stuff with the_row here (NOT matrix[row_index])
}

Alternativ können Sie ein separates Array von Sperrobjekten verwenden:

// a field in your Matrix class
Object[] row_locks;

// initialized like this (probably in your constructor, or whenever the matrix is resized)
for(int row_index = 0; row_index < number_of_rows; row_index++)
row_locks[row_index] = new Object();

// and used like this:
synchronized(row_locks[row_index]) {
// do stuff with the row_index"th row here
}

-2 für die Antwort № 2

Sie müssen ein Array speichern, um die Zeilennummer zu speicherndas ist gerade beschäftigt. Bei jedem Zugriff auf eine Zeile müssen Sie eine Funktion aufrufen, die dieses Array auffüllt, um zu verhindern, dass andere Benutzer auf dieselbe Zeile zugreifen. Wenn Sie mit der Bearbeitung einer bestimmten Zeile fertig sind, löschen Sie die Zeilennummer aus dem Array, um sie wieder für andere zugänglich zu machen.