Java 在这种情况下我需要同步吗

Java 在这种情况下我需要同步吗,java,android,multithreading,listview,Java,Android,Multithreading,Listview,我正在制作Android应用程序。我有一个类,在这个类中,我每30秒从数据库中获得一些订单,如下所示: public class OrderScheduler { private List<OrderMain> orders = Collections.synchronizedList( new ArrayList<OrderMain>()); ... private void main() { servic

我正在制作Android应用程序。我有一个类,在这个类中,我每30秒从数据库中获得一些订单,如下所示:

public class OrderScheduler {
    private List<OrderMain> orders = Collections.synchronizedList(
            new ArrayList<OrderMain>());
    ...
    private void main() {
        service.scheduleAtFixedRate(new Runnable() {
            public void run() {
                orders = getStuff();
            }
        }, 0, 30, TimeUnit.SECONDS);
    }
}
newOrdersListView = (ListView) findViewById(R.id.newOrdersListView);
    OrderScheduler os = OrderScheduler.getInstance();
    List<OrderMain> newOrders = (os.getOrders() == null) ? 
            new ArrayList<OrderMain>() : os.getOrders();
    ArrayAdapter<OrderMain> listAdapter = new ArrayAdapter<OrderMain>(
            this, R.layout.listview_row, newOrders);
    newOrdersListView.setAdapter(listAdapter);
公共类OrderScheduler{
私有列表顺序=Collections.synchronizedList(
新的ArrayList());
...
私有void main(){
service.scheduleAtFixedRate(新的Runnable(){
公开募捐{
orders=getStuff();
}
},0,30,时间单位为秒);
}
}
还有一个Activity类,我在其中创建ListView,其中包含上面列表中的对象,如下所示:

public class OrderScheduler {
    private List<OrderMain> orders = Collections.synchronizedList(
            new ArrayList<OrderMain>());
    ...
    private void main() {
        service.scheduleAtFixedRate(new Runnable() {
            public void run() {
                orders = getStuff();
            }
        }, 0, 30, TimeUnit.SECONDS);
    }
}
newOrdersListView = (ListView) findViewById(R.id.newOrdersListView);
    OrderScheduler os = OrderScheduler.getInstance();
    List<OrderMain> newOrders = (os.getOrders() == null) ? 
            new ArrayList<OrderMain>() : os.getOrders();
    ArrayAdapter<OrderMain> listAdapter = new ArrayAdapter<OrderMain>(
            this, R.layout.listview_row, newOrders);
    newOrdersListView.setAdapter(listAdapter);
newOrdersListView=(ListView)findViewById(R.id.newOrdersListView);
OrderScheduler os=OrderScheduler.getInstance();
列出新订单=(os.getOrders()==null)?
新建ArrayList():os.getOrders();
ArrayAdapter listAdapter=新的ArrayAdapter(
此,R.layout.listview(行,新订单);
setAdapter(listAdapter);
我在javadoc中读取了迭代同步列表时需要同步的内容

我的问题是,当我单击此listview的某些项时,onItemClick方法是否需要在同步块中?我认为当我从listview中选择某个项目时,它基本上需要遍历newOrders列表

顺便说一句,现在我没有同步这个侦听器方法,它似乎可以工作。我不会在这个应用程序中创建比OrderScheduler中的线程更多的线程。
感谢您的帮助。

对于当前代码,您不需要同步任何内容,因为您每次都创建
ArrayList
(如果您使用迭代器,因为它在内部将使用旧的ArrayList)

您需要在迭代时同步列表的原因是,您可能会得到一个
ConcurrentModificationException
(迭代器不允许您在读取列表时对其进行任何更改)


另外,我假设
getStuff
创建了一个新的
ArrayList
,因为您确实创建了
orders=getStuff()
,如果您更改代码以修改ArrayList,您将看到
ConcurrentModificationException
异常。

看起来您的
.getStuff()
方法每次都会生成完全不同的列表;而且它的结果似乎只有一个消费者。此外,使用者似乎不会修改结果

因此,我的建议是使用

然后,您的“生产者”代码将执行以下操作:

ref.set(getStuff());
以及您的“消费者”:

List newOrders=ref.get();

您的
ref
将是生产者和消费者之间共享的
AtomicReference

问问自己谁在执行onItemClick

它是主(UI)thead,因此无论发生什么,无论用户有多疯狂/快速,事件都会(由主线程)连续处理


同步不会产生任何效果。

引用分配在Java中是原子的,因此不需要将其与原子引用过度复杂化。AtomicReference的主要功能来自compareAndSet()和getAndSet()。如果只使用set()和get(),则它没有任何附加功能。@kupsef它的原子属性使它在这种情况下非常有用@kupsef还说,“引用分配在Java中是原子的”,那么,引用分配是原子的。如果你不相信,做一些研究:)好吧,我有点困惑,因为我第一次看到它。我改变了你的建议,看起来效果不错。但我不知道它到底改变了我以前的解决方案。更好吗?无论如何,非常感谢!谢谢你的回答!是的,我不会在OrderScheduler之外的任何地方更改此列表,因此我不会得到此异常。是的,正如您所说,它是用户,因此是此应用程序的主线程。你是说在我原来的解决方案中,列表不需要是同步列表?