Android 如何在使用synchronized时避免不幸的副作用

Android 如何在使用synchronized时避免不幸的副作用,android,synchronized,Android,Synchronized,这篇评论警告说: 锁定此对象或您自己的类对象可能会带来不幸的后果 副作用,因为您无法控制的其他代码会锁定 这些物体也会导致比赛条件和其他恶劣的环境 线程相关的错误 避免竞争条件正是我需要使用修饰符的原因,但当我看到这样的警告时,我意识到我不了解我正在编程的系统的所有信息可能弊大于利 在我的特殊情况下,我需要确保WebView-子类的特定方法不会被PictureListener.onNewPicture()中断 该方法是由我编写的,但它仅由Runnable.run()通过计时器处理程序调用 在决定

这篇评论警告说:

锁定此对象或您自己的类对象可能会带来不幸的后果 副作用,因为您无法控制的其他代码会锁定 这些物体也会导致比赛条件和其他恶劣的环境 线程相关的错误

避免竞争条件正是我需要使用修饰符的原因,但当我看到这样的警告时,我意识到我不了解我正在编程的系统的所有信息可能弊大于利

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

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


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

在同步的类中有一个属性,而不是在
或WebView子类
对象
上同步

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

这些副作用大多会影响服务器系统。我不认为在Android上你会有太多问题,因为没有太多的
其他代码可以触及你的方法。

这些副作用大多会影响服务器系统。我认为在Android上你不会有太多问题,因为没有太多的
其他代码可以触及你的方法。

解决方案是使用私有对象作为对象的锁,如下所示:

在类定义中:

private Object syncRoot=new Object();

在代码中:

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

出现争用条件的原因是其他代码可以访问锁定的对象。仅锁定私有对象可以解决此问题。

解决方案是使用私有对象作为对象的锁,如下所示:

在类定义中:

private Object syncRoot=new Object();

在代码中:

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

出现争用条件的原因是其他代码可以访问锁定的对象。只锁定私有对象就可以解决这个问题。

我刚刚意识到这实际上是在我发布的引文中暗示的,但您所写的内容更加清晰和解释+1我刚刚意识到,这实际上是在我发布的引文中暗示的,但您所写的内容更加清晰和解释+1我想用你的答案来简化我的代码,但我对Android内部工作的了解还不够,无法依赖它。如果有一个特定的源记录,例如,计时器调用总是在
onNewPicture()
事件之间交错,这就足够了,但我不知道。我的观点是不会有太多冲突影响性能。可能会有一些,否则你就不需要同步了。我想用你的答案来简化我的代码,但我对Android内部工作的了解还不够,不能依赖它。如果有一个特定的源记录,例如,计时器调用总是在
onNewPicture()
事件之间交错,这就足够了,但我不知道。我的观点是不会有太多冲突影响性能。会有一些,否则就不需要
同步