【问题标题】:How to avoid unfortunate side-effects when using synchronized使用同步时如何避免不幸的副作用
【发布时间】:2011-09-19 21:03:43
【问题描述】:

@Synchronized 评论警告:

锁定这个或你自己的类对象可能会很不幸 副作用,因为其他代码不受您的控制可以锁定 这些对象也是如此,这可能会导致竞争条件和其他讨厌的 线程相关的错误。

避免竞争条件正是我需要使用synchronized 修饰符的原因,但是当我看到这样的警告时,我意识到我可能会因为不了解而造成的弊大于利 em> 关于我正在为其编程的系统...

在我的特殊情况下,我需要确保WebView-subclass 的特定方法不会被PictureListener.onNewPicture() 中断。

该方法是我编写的,但它只能由 Runnable.run() 通过计时器处理程序调用。

在确定可以安全地使用synchronized 修饰符以确保计时器调用的方法不会被PictureListener.onNewPicture() 中断之前,我应该检查什么?

【问题讨论】:

    标签: android synchronized


    【解决方案1】:

    解决办法是使用私有对象作为对象的锁,像这样:

    在类定义中:

    private Object syncRoot=new Object();
    

    private static Object syncRoot=new Object();
    

    在您的代码中:

    synchronized(syncRoot){
      // put your code here
    }
    

    竞争条件可能发生的原因是其他代码可以访问锁定的对象。只锁定私有对象可以解决这个问题。

    【讨论】:

    • 我刚刚意识到这实际上在我发布的报价中有所暗示,但是您所写的内容更加清晰和解释性强。 +1
    【解决方案2】:

    在您同步的类中有一个属性,而不是在 this 或 WebView 子类 object 上同步。

    【讨论】:

      【解决方案3】:

      这些副作用大多会影响服务器系统。我不认为在 Android 上你会遇到很多问题,因为没有多少other code 可以触及你的方法。

      【讨论】:

      • 我想用你的答案来简化我的代码,但我对 Android 内部工作的了解不够,无法依赖这个。如果有一个特定的来源记录,例如,计时器调用总是在onNewPicture() 事件之间交错,这就足够了,但我不知道。
      • 我的意思是不会有那么多的碰撞影响性能。会有一些,否则你不需要synchronized
      猜你喜欢
      • 1970-01-01
      • 2021-07-30
      • 2021-11-16
      • 1970-01-01
      • 2021-11-09
      • 2021-11-01
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多