2013-06-08 2 views
1

Я синхронизирую код ниже, но это приводит к проблемам параллелизма.Почему этот метод приводит к проблемам параллелизма?

Я знаю, что это вызвано многопоточным, меня смутило ключевое слово synchronized. Я ожидал, что значение list.length равно 100. Как я могу его исправить?

import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 

public class ThreadA extends Thread { 

    private static byte[] lock = new byte[0]; 

    private static final List<String> list = new ArrayList<String>(); 

    @Override 
    public void run() { 

     System.out.println(list.size()); 

     synchronized(lock) { 
      int size = list.size(); 
      if(size == 0) return; 

      if(size >= 100) { 
       list.clear(); 
      } 
     } 

    } 

    public void add(String s) { 
     list.add(s); 
    } 

    public static void main(String[] args) { 

     for(int i = 0; i < 100; i++) { 
      new ThreadA().start(); 
      new Thread(new Runnable() { 

       @Override 
       public void run() { 
        synchronized(lock) { 
         for(int m = 0; m < 100; m++) { 
          list.add(new Date().toLocaleString()); 
         } 
        } 
       } 
      }).start(); 
     } 

     System.out.println("LIST.SIZE:" + list.size()); 
    } 

} 
+1

Это ваша домашняя работа на сегодня? –

+0

Попробуйте добавить эту строку прямо перед окончательной печатью LIST.SIZE: Thread.sleep (4000); Это должно по крайней мере дать вам понять, что происходит неправильно. –

+0

Почему вы ожидали, что размер будет равен 100, а не 0? –

ответ

2

два вопроса:

  1. Println обращается к list без синхронизации и, не дожидаясь нитей, чтобы закончить. Вы получите то, что значение списка было в тот момент.

  2. Нет гарантии, в каком порядке будут выполняться потоки. Может случиться так, что все экземпляры ThreadA запускаются до анонимных потоков, и результат может быть значением, значительно превышающим 100.

+0

Спасибо, это имеет смысл. –

+0

Если ответ оказался полезным, пожалуйста, подтвердите его (нажмите кнопку ^). –

Смежные вопросы