Hi Bob,
I think you're right about the problem with the (vertexCount == null)
test in the constructor,
but I would suggest an other fix than the one you have implemented
because the test in the constructor is here to avoid unnecessary calls
to a synchronized method (which is bad in general for performance)
My suggestion :
- keep the test in the constructor
- use a temporary variable in initialize() so that vertexCount is
assigned only at the end of the method
Nico
Bob Hanson wrote:
> Miguel,
>
> What I meant was that the check for null array must be within the
> synchronized method initialize(), not in the constructor. So the two
> changes I effected were
>
> a) static added for initialize(), as per Nico's excellent observation
> b) remove check for null in the Geodesic3D constructor:
>
>
> Geodesic3D(Graphics3D g3d) {
> this.g3d = g3d;
> initialize();
> }
>
> private static synchronized void initialize() {
> if(vertexCounts != null)
> return;
> vertexCounts = new short[maxLevel];
> ....
> }
>
> Do you see what the problem was in having the check for null in the
> constructor itself?
>
> Sorry about the confusion with constructors -- a book I have seemed to
> suggest that threads cannot yield while constructing, but that's
> obviously a misreading on my part.
>
> The problem was definitely in the missing static keyword, which Nico
> found... and the misplaced check for the start of initialization, which
> must appear ONLY within the synchronized method itself, not allowing a
> bypass of that synchronization. That's because if a second thread is
> allowed to bypass initialize() and not sync there, waiting for the first
> thread to complete, then it can skip right to code in Isosurface that
> requires those normals prior to the first thread completing the
> initialization. Right?
>
>
_______________________________________________
Jmol-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jmol-developers