Вам необходимо синхронизировать все операции операции чтения и записи объекта на одном и том же объекте монитора. В противном случае это is возможно для других потоков, чтобы изменить значение, пока текущий поток запущен. Поэтому я бы предложил использовать 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);
}
}
Этот код может или не может хорошо подходить с существующим классом приложений. Если вы чувствуете, что там не подходит, создайте новый класс и новый объект, обеспечивающий доступ к вашим временным историям. Используйте этот новый класс для синхронизации всего доступа к вашему временному сюжетному объекту.
если этот рабочий поток не синхронизируется на том же объекте, что и поток, который выполняет линию A/B да. весь доступ к временному хранилищу должен быть синхронизирован с одним и тем же объектом! – ParkerHalo
Могу ли я синхронизировать каждое чтение/запись в application.temporaryStory на самой временной странице? –
Я думаю, что это должно быть возможно! – ParkerHalo