Hi,

In addition to the behavior we experienced in function setAttribute. We also
experienced another atomicity violation in function removeAttribute.

The following code is located at the beginning of function removeAttribute
at class ApplicationContext. This code fragment intends to check whether a
key is already inside the “attributes” collection. If it does, then the key
is removed from the collection and the function continues running while
assigning the corresponding value to “value”. Otherwise, the function should
return.




found = attributes.containsKey(name);

if (found) {

value = attributes.get(name);

            attributes.remove(name);

} else {

return;

}



This code can behave non atomically when two different threads call
removeAttribute function with the same attribute name. In this case, there
exists a thread interleaving where two threads enter the “if” condition
while the first one removes “name” from the attributes collection before the
second one runs the get operation. This causes the function to continue
running with value == null instead of returning.



Could you please let me know whether you consider this as a bug?



A possible way of modifying the code in order to execute this code
atomically is as follows:



if (attributes.containsKey(name)) {
    value = attributes.remove(name);
    if (value == null)
        return;
}



Thanks,

Ohad

Reply via email to