Knut Anders Hatlen wrote:
> "Andreas Korneliussen (JIRA)" <derby-dev@db.apache.org> writes:
> 
>> Assuming the Derby embedded JDBC driver is thread-safe, it should be
>> safe for a result set to call its own close() method in its
>> finalizer. If you get a dead-lock in the finalizer, it proves that
>> it is also possible to write a multithreaded program which gets
>> deadlocks when calling ResultSet.close, and derby then is not really
>> MT-safe.
>>
>> If this happens, I think it is better to fix the embedded driver so
>> that it really becomes MT-safe, than avoiding synchronization in the
>> finalizer threads.
> 
> There are calls to System.runFinalization() many places in the
> code. If the thread that invokes System.runFinalization() has obtained
> the same mutex that a finalize method requires, there can indeed be
> deadlocks. (But I guess you will argue that we shouldn't call
> runFinalization() explicitly.)
> 
Yes.

>> As for the suggested change in 1142, I would note that If there is
>> no synchronization in the finalizer, and you set a field in a object
>> from it, there is no guarantee that other threads will see the
>> modification of the field (unless, I think, it is
>> volatile). However, I think Mayuresh has been working on this issue,
>> so maybe he has tried that approach?
> 
> FWIW, I tried that approach in my sandbox (setting a volatile variable
> in GenericLanguageConnectionContext from BaseActivation.markUnused())
> and I didn't see the OutOfMemoryError any more. It's a very simple
> fix, and I don't think the overhead is noticeable, so I'd recommend
> that we go for that solution.
> 
Seems like a good idea.

Andreas


Reply via email to