Was ist die Verwendung von Sammlungen.synchronizedList () - Methode? Es scheint nicht zu synchronisieren, die Liste

Ich versuche, fügen Sie String Werten zu einer ArrayList mit zwei threads. Was ich will, ist, dass während ein thread ist das hinzufügen der Werte, der andere thread sollte nicht stören, also habe ich die Collections.synchronizedList Methode. Aber es scheint, dass, wenn ich nicht explizit synchronisieren auf ein Objekt hinzufügen, wird in einem nicht synchronisierte Weise.

Ohne ausdrückliche synchronisierten block:

public class SynTest {
    public static void main(String []args){
        final List<String> list=new ArrayList<String>();
        final List<String> synList=Collections.synchronizedList(list);
        final Object o=new Object();
        Thread tOne=new Thread(new Runnable(){

            @Override
            public void run() {
                //synchronized(o){
                for(int i=0;i<100;i++){
                    System.out.println(synList.add("add one"+i)+ " one");
                }
                //}
            }

        });

        Thread tTwo=new Thread(new Runnable(){

            @Override
            public void run() {
                //synchronized(o){
                for(int i=0;i<100;i++){
                    System.out.println(synList.add("add two"+i)+" two");
                }
                //}
            }

        });
        tOne.start();
        tTwo.start();
    }
}

Die Ausgabe, die ich habe ist:

true one
true two
true one
true two
true one
true two
true two
true one
true one
true one...

Mit der ausdrücklichen synchronized-block auskommentiert, ich bin das stoppen der Einmischung aus dem anderen thread, die beim hinzufügen. Mal den thread erworben hat, die Sperre wird ausgeführt, bis es fertig ist.

Beispiel-Ausgabe nach dem einkommentieren der synchronisierte block:

true one
true one
true one
true one
true one
true one
true one
true one...

Also, warum ist das Collections.synchronizedList() nicht tun, die Synchronisierung?

Schreibe einen Kommentar