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);
    }
}

此代码可能适合您现有的应用程序类,也可能不太适合。如果您觉得它不合适,请创建一个新类和一个新对象,以访问您的临时故事。使用此新类可以同步对临时故事对象的所有访问。

09-28 07:49