- Безопасна ли в этом случае сериализация?
Нет. Как говорит @Tom Hawtin, вам нужно будет выполнить собственную блокировку, чтобы гарантировать, что объекты не будут изменены во время их сериализации.
- Как это работает под капотом? То есть будет ли ObjectOutputStream выполнять блок сериализации до тех пор, пока никакие потоки больше не будут работать с Counter?
ObjectOutputStream
не блокируется под капотом. Это зависит от приложения, если это необходимо.
- Что если в синхронизации счетчика используется не внутренняя блокировка, а какая-то другая блокировка?
Тогда вашему приложению также потребуется использовать эту другую блокировку для блокировки обновлений во время сериализации.
Если состояние, которое вы сериализуете, просто состоит из состояния одного объекта с двумя полями, то конфликт блокировки и детализация не должны быть проблемой. Но если объект (ы) сложен, тогда конфликт блокировки может быть проблематичным, так же как и проблема получения блокировок без риска тупика. Этот сценарий потребует тщательного проектирования.