In Java specifications' cases (Java EE, JSF, other JSRs) you usually have a reference implementation created while drafting the spec (Glassfish in case of Java EE), then you have other providers who may create their own implementation of the spec (often claiming it's "better" in some way).
You as a developer then write code that can use the facilities provided by the spec, which would run correctly on any compliant implementation.