Тестовый код ArrayList ThreadSafety завершается неудачно - PullRequest
0 голосов
/ 17 июля 2011

Учитывая, что добавить определение метода в ArrayList следующим образом: -

public boolean add(E e) {
ensureCapacity(size + 1);  // Increments modCount!!
elementData[size++] = e;
return true;
}

Пожалуйста, найдите следующую программу для проверки безопасности потоков ArrayList.

package pack4;

import java.util.ArrayList;

public class Demo {

    public static void main(String[] args) {
        ArrayList<String> al = new ArrayList<String>() ;
        new AddFirstElementThread(al).start() ;
        new RemoveFirstElementThread(al).start() ;
    }
}

class AddFirstElementThread extends Thread{

    ArrayList<String> list ;

    public AddFirstElementThread(ArrayList<String> l) {
        list = l ;
    }

    @Override
    public void run() {
        while(true){
            if(list.size() == 0){
                list.add("First element") ;
            }
        }
    }
}

class RemoveFirstElementThread extends Thread{

    ArrayList<String> list ;

    public RemoveFirstElementThread(ArrayList<String> l) {
        list = l ;
    }

    @Override
    public void run() {
        while(true){
            if(list.isEmpty()){
                try{
                    list.get(0) ;
                    System.out.println("Hence Proved, that ArrayList is not Thread-safe.");
                    System.exit(1) ;
                }catch (Exception e) {
                        //continue, if no value is there at index 0
                }
            }
        }
    }
}

Но программа никогда не завершается, поэтому не может доказать поточность ArrayList.

Пожалуйста, предложите правильную реализацию, чтобы протестировать поточно-ориентированное поведение ArrayList и Vector.

Спасибо и наилучшими пожеланиями,

Rits

Ответы [ 3 ]

2 голосов
/ 17 июля 2011

ArrayList не является поточно-ориентированным; Vector есть. Вы можете обернуть ArrayList с Collections.synchronizedList(), если вам нужно.

1 голос
/ 17 июля 2011

Суть небезопасного кода в том, что нет гарантии того, как он будет себя вести при использовании нескольких потоков. Вы не можете гарантировать, что небезопасный код не удастся. Это потому, что код не написан, чтобы быть небезопасным, он может не иметь никаких гарантий, что это так. Безопасность потока может быть определена только путем чтения и понимания кода.

Проблема с безопасностью потоков заключается в том, что это очень трудно доказать экспериментально. Нелегко доказать, что что-то не является потокобезопасным, если вы не знаете точный крайний случай, который вызовет проблему. Кроме того, проблемы безопасности потоков более или менее вероятно проявятся в зависимости от архитектуры вашей системы и нагрузки на нее. то есть он может нормально работать в течение нескольких дней и непредсказуемо потерпеть неудачу.

0 голосов
/ 17 июля 2011

«Потокобезопасность» в коллекциях была довольно плохой идеей для начала в подавляющем большинстве случаев, потому что она слишком узка, и вам все равно нужна некоторая синхронизация более высокого уровня.

На случай, если вы действительно хотитечтобы удалить первый элемент или добавить элемент в список, лучше использовать, например, this здесь , но ваш надуманный пример в любом случае может нуждаться в более высокой синхронизации (зависит от того, какой именно должна быть семантика - еслиВы не понимаете, почему, возможно, это действительно хорошая идея прочитать кое-что о параллелизме)

И, наконец, просто взгляните на параллельную платформу .

...