2016-07-15 16 views
0

-Code wie unten Snippet manipuliert werden:warum synchronisierten Objekt kann noch

List<String> list = new ArrayList<>(); 

public void addValue(int i) { 
    synchronized (list) { 
     list.add("list" + i); 
    } 
} 

Meine Frage ist, dass das, was nach Stichwort synchronized gesperrt ist.
Was wird von der list überprüft werden, wenn zwei Threads fragen, um den Codeblock auszuführen?
Die gleiche Frage ist, dass ich this synchronisiert, aber seine Felder können noch geändert werden.

Antwort

0

Der synchronisierte Block ist gesperrt. Wenn der Code ausgeführt wird, sperrt ein Thread das Objekt nicht, sondern es OBACHTAINS das Schloss des Objekts list (das ist ein markiertes Wort innerhalb des Objektheaders), damit kein anderer Thread die gleiche Sperre erhalten kann. Daher kann der Code innerhalb des Blocks nur von einem Thread gleichzeitig ausgeführt werden.