Модель памяти Java позволяет JVM оптимизировать обратный доступ и, например, если это однопоточное приложение, если поле не отмечено как volatile
или доступ с блокировкой (история немного усложняется блокировки фактически).
В приведенном примере JVM может сделать вывод, что поле ready
не может быть изменено в текущем потоке, поэтому оно заменило бы !ready
на false
, в результате чего бесконечная петля. Маркировка поля как volatile
приведет к тому, что JVM будет проверять значение поля каждый раз (или, по крайней мере, гарантировать, что изменения ready
распространяются на текущий поток).
Согласно документации Pickle , вы можете предоставить метод с именем __getstate__()
, который возвращает что-то, представляющее состояние, которое вы хотите мариновать (если оно не предоставлено, pickle
использует thing.__dict__
]). Таким образом, вы можете сделать что-то вроде этого:
class Thing:
def __getstate__(self):
state = dict(self.__dict__)
del state['cachedBar']
return state
Это не должно быть диктом, но если это что-то другое, вам также нужно реализовать __setstate__(state)
.
Реализовать __getstate__
, чтобы вернуть только те части объекта, которые должны быть засолены