Taking ThreadCritical lock is not necessary while compare-and-swap can do the work.
original:
new_entry = ClassLoader::create_class_path_entry(_path, &_st, false, CHECK_NULL);
{
ThreadCritical tc;
if (_resolved_entry == NULL) {
_resolved_entry = new_entry;
return new_entry;
}
}
with CAS
new_entry = ClassLoader::create_class_path_entry(_path, &_st, false, CHECK_NULL);
if (Atomic::cmpxchg_ptr(NULL, &_resolved_entry, new_entry) == NULL) {
return new_entry;
}
original:
new_entry = ClassLoader::create_class_path_entry(_path, &_st, false, CHECK_NULL);
{
ThreadCritical tc;
if (_resolved_entry == NULL) {
_resolved_entry = new_entry;
return new_entry;
}
}
with CAS
new_entry = ClassLoader::create_class_path_entry(_path, &_st, false, CHECK_NULL);
if (Atomic::cmpxchg_ptr(NULL, &_resolved_entry, new_entry) == NULL) {
return new_entry;
}