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()
事件之间交错,这就足够了,但我不知道。我的观点是不会有太多冲突影响性能。会有一些,否则就不需要同步
。