Auf Thema antworten

Was ich in diesem Zusammenhang noch interessant finde ist, das ein synchronized Wrapper in diesem Fall gar nichts bewirkt, wahrscheinlich weil ich von 2 verschiedenen Referenzen auf die Liste zugreife.


[code=Java]

package threadtest1;


import java.util.ArrayList;

import java.util.Collections;

import java.util.Iterator;

import java.util.List;


public class Main {


    private final List<String> list;


    public Main() {

        list = Collections.synchronizedList(new ArrayList<String>());

        ListIteration li = new ListIteration();

        li.start();

        while(true) {

          //  synchronized(list) {

                for(int i = 0; i < 5; i++) {

                    list.add("Hallo" + i);

                    }

                for(Iterator<String> iterator = list.iterator(); iterator.hasNext();) {

                    String next = iterator.next();

                    System.out.println("im EDT");

                    }

                li.setList(list);

                }

           // }

        }


    public static void main(String[] args) {

        new Main();

        }

}


class ListIteration extends Thread {


    private List<String> list;


    public ListIteration() {

        list = new ArrayList<String>();

        }


    public void setList(List<String> list) {

        this.list = Collections.synchronizedList(list);

        }


    @Override

    public void run() {

        while(true) {

            final List l = this.list;

            //synchronized(l) {

                for(Iterator<String> iterator = list.iterator(); iterator.hasNext();) {

                    final String next = iterator.next();

                    System.out.println("im Thread");

                    iterator.remove();

                    }

              //  }

            }

        }

    }


[/code]



Oben