{'fraction_non_alphanumeric': 0.027848101265822784, 'fraction_numerical': 0.0, 'mean_word_length': 5.084615384615384, 'pattern_counts': {'":': 0, '<': 0, '<?xml version=': 0, '>': 0, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
Annotation-Based Diagrams for Shared-Data Concurrency

In languages such as Java and Ada, there are a number of significant concurrency-related design decisions that may not be manifest locally in code. These include, for example, the identification of shared state, how that state is protected, which threads may visit that state, and so on. These decisions relate threads, code, and shared data. We describe new UML-style diagrams that can help make explicit some useful aspects of these relationships. In addition, by using lightweight annotations on source code, we can document how these decisions are realized. By combining diagrams and annotations, we can support both forward and reverse engineering, using tools and analyses to keep the diagrams consistent with the annotated code.