A load module can be marked non-reusable, reusable and re-entrant. To simplify somewhat:
A non-reusable module can only be loaded for one task - the code is assumed to be self-modifying (data and code are in the same load module).
A reusable (“serially reuseable”) module can be used by a second task when the first is finished with it (generally the module will acquire its own data space dynamically).
A re-entrant module can be used by multiple tasks at the same time - data areas are provided by the calling routines.
Shared routines (eg ADAIOR) will generally need to be re-entrant and reusable so multiple threads can share the same copy of the load module in memory at the same time. Client applications (ADARUN) are usually not re-entrant and often not re-usable - a fresh, non-shared copy of the module is loaded into each task’s memory.