Я пытался решить проблему, связанную с list.add
и list.remove
с комбинацией в использовании Thread in java. Давайте предположим, что мы будем играть с StackArrayList <object> манипуляции с использованием Thread in Java
это мой Stack класс определение ..
import java.util.ArrayList;
public class Stack {
private int size;
private int maxSize;
private final ArrayList<Object> list;
public Stack(int size) {
this.size = 0;
this.maxSize = size;
this.list = new ArrayList<Object>(size);
}
public boolean push(Object o) {
if (size >= maxSize) {
return false;
}
this.list.add(0, o);
this.size++;
return true;
}
public Object pop() {
Object o;
if (this.size == 0) {
return null;
}
o = this.list.remove(0);
this.size--;
return o;
}
public int size() {
return this.size;
}
}
А вот как мы с использованием стека в потоке в Java
final Stack stack = new Stack(4);
for(int i = 0; i < 10000; i++) {
final String data = "hello " + i;
final int x = i;
new Thread(new Runnable() {
public void run() {
if(x % 2 == 0) {
System.out.println(stack.push(data));
} else {
System.out.println(stack.pop());
}
}
}).start();
}
Поэтому в основном мы просто создать 10000 для управления объектом Stack. stack.push
привело True (если стек еще не полностью) или ложным (если стек уже заполнен) stack.pop
привела нуль, если стек пуст
И вопрос: Что случилось с реализацией стека выше, и как это исправить?
Мой анализ до сих пор, как поток работает в java. Поток запускается параллельно, а не последовательно. Я попытался выполнить программу, и иногда вызывается исключение IndexOutOfBounds
. Если мой анализ верен (или закрыт), есть ли способ избежать исключения? Может быть, есть некоторый метод проверки в классе Stack?
Если мой анализ является ложным, то что не так с реализацией выше? и как это исправить?
Реализация стека не является потокобезопасной. Безопасность потоков - это защита изменчивого состояния, чтобы объекты подвергались последовательным, надежным переходам состояния при доступе одновременно. К сожалению, ваш класс подвержен условиям гонки, которые оставят ваши объекты неопределенным или непоследовательным состоянием. Использование блокировки для принудительного взаимного исключения потоков - это простой (если не исполнительный) способ обеспечения перехода атомарного состояния. – scottb