Является ли параллелизм на практике нарушением листинга 5.15?
В JCIP, листинг 5.15, Гетц демонстрирует класс, использующий CyclicBarrier, но что меня заинтриговало, так это то, что внутри конструктора класса, использующего этот барьер, он позволяет ссылочной ссылке ускользать, создавая новый CyclicBarrier.
Для других потоков, использующих объект из этого класса путем вызова его метода start, разве они не могли видеть плохие результаты, так как созданный объект, который они вызывают, запускается, может не иметь видимых его полей mainBoard, барьер и рабочие?
Я понимаю, что если вещи являются окончательными, они гарантированно будут видны другим потокам после построения, но это только в том случае, если они правильно построены.
Под видимым я подразумеваю с точки зрения безопасной публикации, где другие потоки видят правильные значения, а также объекты и ссылки, которые были созданы конструкцией durimg.
Код также позволяет этой ссылке экранировать при вызове new на Worker внутри конструктора.
Чем больше я читаю, тем больше меня смущает безопасная публикация и видимость. Может кто-нибудь уточнить, как это работает?
Это, кажется, противоречит тому, что Гетц сказал нам не делать в главе 3, где он объясняет, почему класс Holder нарушен, показывая, что может пойти не так в листинге 3.15.
Я не могу понять, почему этот пример (листинг 5.15) в порядке.