在Android中何时应该使用锁定,何时应该使用synchronized?有区别吗?

时间:2014-07-05 15:19:52

标签: java android multithreading thread-safety locks

我有一个ArrayList,我在broadcastreceiver回调中添加项目。

然而,arraylist最终将附加到适配器,然后我希望将数组的内容显示在屏幕上。

该数组包含我正在处理的P2P应用程序的对等信息,因此当设备进入和退出连接/范围时,它会经常更改。

基本上,arraylist将经常被读取和写入。 我来自c ++背景,所以我通常会在访问它时使用锁来保护我的arraylist,但我不确定我应该在java / android中使用什么。 任何建议请。

3 个答案:

答案 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锁定在同一个对象上。