Тема: Чи потрібна у даному випадку синхронізація?
Задача така - потік виконує список завдань, які додаються динамічно до цього списку.Якщо потік їх виконав всі, то він засинає до находження наступних. 
class MyThr implements Runnable
{
    private List<String> tasks;
    private Thread owner=null;
    private boolean stop=false;
    public MyThr(List<String> tasks)
    {
        this.tasks=tasks;
    }
    public void Stop()
    {
        stop=true;
    }
    @Override
    public void run() 
    {
        // TODO Auto-generated method stub
        for(;;)
        {
            if(stop==true){break;}
            if(owner==null)
            {
                owner=Thread.currentThread();
            }
            
            if(tasks.isEmpty()==false)
            {
                String task=(String) tasks.get(0);
                tasks.remove(task);
                System.out.println(task);
                try 
                {
                    owner.sleep(2000);//імітація затримки,під час обміну даними через сіть
                } 
                catch (InterruptedException e){                }
            }
            else
            {
                try 
                {
                    owner.sleep(Long.MAX_VALUE);
                } 
                catch (InterruptedException e){                }
            }
        }
    }
    
}
public class Main 
{
    public static void main(String[] args) 
    {
        // TODO Auto-generated method stub
        List<String> tasks=new ArrayList<String>();
        tasks.add("1111");
        tasks.add("2222");
        tasks.add("3333");
        tasks.add("4444");
        MyThr mthr=new MyThr(tasks);
        Thread thr=new Thread(mthr);
        thr.start();
        for(int i=0;i<10;i++)
        {
            tasks.add(String.valueOf(i+1)+" !!!! ");
        }
        if(thr.getState() == java.lang.Thread.State.TIMED_WAITING)
        {
            thr.interrupt();
        }
        try
        {
            System.in.read();
        } 
        catch (IOException e) {        }
        mthr.Stop();
        thr.interrupt();
    }
}ЧИ обов'язково синхронізувати доступ до List<String> ?