Как сделать поток массива безопасным в Java?JAVA

Программисты JAVA общаются здесь
Anonymous
Как сделать поток массива безопасным в Java?

Сообщение Anonymous »

Я новичок в многопоточности и хочу понять ее лучше. Теперь я хочу узнать, как сделать массив потокобезопасным в 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

Вернуться в «JAVA»