application.temporaryStory
是全局可见的Story
对象,至少2个线程可以读写。
在适配器中,我有以下代码;
synchronized (this){
if(application.temporaryStory!=null){ // Line A
application.temporaryStory.setLastImageViewed(position); // Line B
}
}
该代码在主线程中执行。
尽管有同步块(synchronized block),工作线程是否有可能在A行的 checkin 和B行的代码之间使
application.temporaryStory
对象无效? 最佳答案
您需要将所有读写操作的同步到同一监视器对象上的对象。否则,其他线程可能会在当前线程运行时更改该值。所以我建议在这里使用application
,因为它似乎是temporaryStory
的“所有者”:synchronized (this){
if(application.temporaryStory!=null){
application.temporaryStory.setLastImageViewed(position);
}
}
当您将temporaryStory
封装在某个地方(例如在应用程序中,但也许有更好的地方)时,效果会更好,因此只能通过同步方法进行访问。
但是要做到这一点,您需要以原子方式将所有需要访问temporaryStory
的代码移到封装类中。因此,您示例中的代码将需要移至Application类:public synchronized void setLastImageViewed(...) {
if(application.temporaryStory!=null){ // Line A
application.temporaryStory.setLastImageViewed(position);
}
}
此代码可能适合您现有的应用程序类,也可能不太适合。如果您觉得它不合适,请创建一个新类和一个新对象,以访问您的临时故事。使用此新类可以同步对临时故事对象的所有访问。