我有一个ArrayList,我在broadcastreceiver回调中添加项目。
然而,arraylist最终将附加到适配器,然后我希望将数组的内容显示在屏幕上。
该数组包含我正在处理的P2P应用程序的对等信息,因此当设备进入和退出连接/范围时,它会经常更改。
基本上,arraylist将经常被读取和写入。 我来自c ++背景,所以我通常会在访问它时使用锁来保护我的arraylist,但我不确定我应该在java / android中使用什么。 任何建议请。
答案 0 :(得分:1)
使用BlockingQueue
代替ArrayList
。它会使你的列表线程安全。根据Documenatation:
A Queue that additionally supports operations that wait for the queue to become non-empty when retrieving an element, and wait for space to become available in the queue when storing an element.
答案 1 :(得分:1)
使用锁永远不会错。所有同步确实是使用引擎盖下的锁。一些Java纯粹主义者可能会抱怨,但是你只需要使用信号量就可以获得更大的灵活性(有时它只是唯一正确的方法)。还有一些丑陋的角落要等待/通知您必须真正了解信号量正好避免的用例。如果您熟悉它们,我会毫不犹豫地使用它,因为您现在使用的是Java。
答案 2 :(得分:0)
synchronized关键字锁定指定的任何对象。如果该方法被标记为synchronized并且其实例方法将其锁定在封闭实例上。如果方法是静态的,它会锁定类对象。如果在syncrhonized块中的synchronized关键字之后的括号中指定了对象,则锁定将保留在该对象上。我通常会使用像AndroidWarrior建议的线程安全集合,但如果不可能,只需确保你的访问器和mutator锁定在同一个对象上。