Я пытаюсь добавить значения String
в ArrayList
, используя два потока. Я хочу, чтобы в то время как один поток добавлял значения, которые другой поток не должен вмешиваться, я использовал метод Collections.synchronizedList
. Но кажется, что если я не выполняю явно синхронизировать объект, добавление выполняется несинхронизированным образом.
Без явного синхронизированного блока:
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();
}
}
Выход, который я получил:
true one
true two
true one
true two
true one
true two
true two
true one
true one
true one...
Когда явный синхронизированный блок раскомментирован, я останавливаю помехи от другого потока при добавлении. После того, как поток приобрел блокировку, она выполняется до тех пор, пока она не будет завершена.
выбор образца после раскомментирования синхронизированного блока:
true one
true one
true one
true one
true one
true one
true one
true one...
Итак, почему Collections.synchronizedList()
не выполняет синхронизацию?