Raif S. Naffah wrote;
> i followed the advice given in [1] and synchronized the code
> in the BigInteger finalize() method which now looks like so:
This is not yet sufficient. *All* native method calls that use the
native_ptr need to be synchronized.
It is also not very good practice to synchronize on the object itself
and you really shouldn't have a finalize method that is non-final
(otherwise untrusted code can leak unmanaged memory by allocating
BigInteger subclasses that override the finalize and don't call the base
class method).
When working with a pointer to native memory (or a handle) the only
reliable pattern is really:
class BigInteger
{
private NativeData nd = new NativeData();
private static final class NativeData
{
private Pointer native_data;
synchronized int Compare(BigInteger x, BigInteger y)
{
return natCompare(x.nd.native_data, y.nd.native_data);
}
protected synchronized void finalize()
{
natFinalize(native_data);
}
private native void natFinalize(Pointer p);
private native int natCompare(Pointer x, Pointer y);
}
}
Regards,
Jeroen