Я новичок в многопоточности и хочу понять ее лучше. Теперь я хочу узнать, как сделать массив потокобезопасным в Java? Это означает, что у меня есть несколько потоков, которые обращаются к данным в массиве и изменяют их, и я хочу, чтобы один поток не изменял данные, в то время как другой поток их читал.
Мой подход был следующим:
У меня есть класс Data, содержащий массив и два метода
updateData(Integer[] data) и
getUpdate() для доступа к массиву и управления им.
Код: Выделить всё
public class Data {
private T[] data;
public T[] getUpdate() {
synchronized (this) {
return data.clone();
}
}
public void updateData(T[] data) {
synchronized (this) {
this.data = data.clone();
}
}
}
Этот объект данных теперь используется в двух разных потоках: основном потоке, который обновляет данные, и потоке Swing EDT, который считывает данные и использует их.
Код: Выделить всё
public static void main(String[] args) {
Data data = new Data();
data.updateData(new Integer[]{1,2,3,4,5,6,7,8,10});
SwingUtilities.invokeLater(() -> {
ColumnVisualizer visualizer = new ColumnVisualizer();
new Timer(100, e -> {
visualizer.setData(data.getUpdate());
}).start();
});
while(condition) {
data.updateData(createNewData());
}
}
Насколько я понимаю, я обращаюсь к массиву только через методы
updateData() и
getUpdate(), которые я сделал потокобезопасными с ключевым словом Synchronized сами данные являются потокобезопасными. Поскольку, если поток вызывает метод
getUpdate(), он устанавливает блокировку экземпляра Data, и когда другой поток хочет вызвать
updateData(), он не может получить доступ к той части, где старый массив заменяется новым до тех пор, пока экземпляр Data больше не будет просматриваться.
Правильно ли я это понимаю и является ли это удобным подходом для обеспечения потокобезопасности массива в Java?< /п>
Подробнее здесь:
https://stackoverflow.com/questions/786 ... fe-in-java