For each atomic operation, the algorithm must be able to determine the operations that may execute in parallel with the atomic operation and the instance variables that the operations update.
Specifically, it produces the set of operations that each parallel phase may invoke and the set of instance variables that these operations may update [Rinard and Diniz 1997].
The analysis takes place at the granularity of instance variables and multisets of invoked operations: two operations commute if the instance variables and multisets of invoked operations are the same in both execution orders [Rinard and Diniz 1997].
It therefore scans each method to make sure that it never accesses a non-extent-constant instance variable after it executes a call site that invokes a full method.
The first test relies on the type system; if the classes of the receivers of the two methods are different, then the two methods are guaranteed to be independent.(6) The second test analyzes the instance variable usage to check that neither method writes an instance variable that the other accesses.
This is achieved by redefining or suppressing attributes (
instance variables and methods), reimplementing methods, changing class interfaces, etc.
Concrete specialization, which I would define as the programming expression of inheritance through the addition of
instance variables, sometimes conflicts with abstract specialization, which I would define as the expression of the is-a relation from the world being modeled.