У меня есть List, который должен использоваться как в потокобезопасном контексте, так и в потокобезопасном. Какой из них будет, невозможно заранее определить.
В таком специальном случае, когда список входит в небезопасный контекст, я обертываю его с помощью
Collections.synchronizedList(...)
Но я не хочу его обертывать, если не вводит небезопасный контекст. F.e., потому что список огромен и интенсивно используется.
Я читал о Java, что его политика оптимизации строго о многопоточности - если вы не правильно синхронизируете свой код, не гарантируется, что он будет корректно выполняться в контексте между потоками - он может значительно реорганизовать код, обеспечивая согласованность в контексте только одного потока (см. http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.3). F.e.,
OP1; op2; op3;
может быть реорганизована в
op3; op2; OP1;
если он производит тот же результат (в контексте одного потока).
Теперь мне интересно, если я
-
заполнить мой список, прежде чем обернуть его synchronizedList,
-
затем заверните его,
-
затем используйте другой поток
- есть ли вероятность, что в другом потоке этот список будет заполнен только частично или вообще не заполнен? Может ли JVM отложить (1) до после (3)? Есть ли правильный и быстрый способ сделать (большой) список небезобезопасным, чтобы стать потокобезопасным?