Represents a unique page within the application. Pages are part of the
internal structure of a Tapestry application; end developers who refer to "page" are really referring to the {@link #getRootComponent() rootcomponent} of the actual page.
Starting in release 5.2, the nature of pages changed considerably. Pages are no longer pooled instances. Instead, pages are shared instances (per locale) but all internal
mutable state is stored inside {@link PerthreadManager}. Page construction time is considered to extend past the {@linkplain PageLifecycleCallbackHub#addPageLoadedCallback(Runnable) page loaded callback}. This is not quite perfect from a threading point-of-view (arguably, even write-once-read-many fields should be protected by synchronized blocks or other mechanisms). At best, we can be assured that the entire page construction phase is protected by a single synchronized block (but not on the page itself). An ideal system would build the page bottom to top so that all assignments could take place in constructors, assigning to final fields. Maybe some day.
The Page object is never visible to end-user code, though it exposes an interface ( {@link PageLifecycleCallbackHub} that{@linkplain org.apache.tapestry5.ComponentResources#getPageLifecycleCallbackHub() is}).