Coordinating Distributed Objects presents a novel object-oriented methodology to simplify the construction of distributed software systems. The methodology is based on a programming construct, called synchronizer, that allows the coordination of distributed application components to be programmed in a modular fashion and at a high level of abstraction. The methodology offers new insight into the problem of coordination in distributed systems and can be applied to a broad spectrum of distributed software systems such as process control, multimedia, and groupware. Current methodologies for developing distributed applications do not adequately address the complexity of coordinating application components. The coherence between asynchronous application components, for instance, is usually implemented by explicitly programming a large number of messages and the responses to them. The synchronizer construct, however, implements coordination as abstract and reusable coordination constraints, and thereby reduces code size and complexity by an order of magnitude. Synchronizers offer other attractions as well: they maintain procedural abstraction, data encapsulation, and inherent concurrency. Overall, they allow coordination to be expressed at a level of abstraction that is much closer to the mental model of code developers. Coordinating Distributed Objects Contents List of Figures List of Tables List of Examples Foreword Acknowledgments 1 Introduction 1.1 Object-Oriented Programming 1.2 Actors 1.3 Coordination 1.4 Overview 2 Synchronization Constraints 2.1 Design Considerations 2.2 Specification of Synchronization Constraints 2.3 Inheritance of Synchronization Constraints 2.4 Refinement of Synchronization Constraints 2.5 Possible Extensions 2.5.1 Set-Based Patterns 2.5.2 Message Priority 2.5.3 Garbage Collection of Obsolete Messages 2.6 Related Work 2.6.1 Semaphores and Monitors 2.6.2 Path Expressions 2.6.3 Receive Actions 2.6.4 Activation Conditions 2.6.5 Explicit Method Enabling 2.6.6 Hybrid Approaches 2.7 Conclusion 3 Synchronizers 3.1 Design Considerations 3.2 Synchronizers and Synchronization Constraints 3.3 Functionality of Synchronizers 3.4 Language Support for Synchronizers 3.4.1 Message Patterns 3.4.2 Triggers 3.4.3 Disabling Constraints 3.4.4 Atomicity Constraints 3.4.5 Composing Disabling and Atomicity Constraints 3.5 Combined Evaluation 3.6 Application of Synchronizers 3.7 Possible Extensions 3.7.1 Constraining Specific Messages 3.7.2 Conditions for Synchronizer Enforcement 3.7.3 Multimessage Patterns 3.7.4 Incremental Strengthening of Atomic Constraints 3.8 Related Work 3.8.1 Explicit Coordinators 3.8.2 Transactions 3.8.3 Atomic Broadcast 3.8.4 Multiparty Interactions 3.8.5 Triggers 3.8.6 Multimedia Synchronization 3.8.7 Constraint-Based Languages 3.8.8 Global Assertions 3.8.9 Graph Rewriting 3.8.10 Documentation of Coordination 3.9 Conclusion 4 Semantics 4.1 Language Overview 4.2 Language Syntax 4.2.1 Primitive Operations 4.2.2 Actors 4.2.3 Synchronizers 4.2.4 Examples 4.3 Representation of Actor Systems 4.3.1 Representation of Actors 4.3.2 Representation of Messages 4.3.3 Configurations 4.4 Expression Evaluation 4.5 Constraint Evaluation 4.5.1 Semantics of Disabling Constraints 4.5.2 Semantics of Atomicity Constraints 4.6 Trigger Evaluation 4.7 Transitions Between Configurations 4.8 Discussion 4.9 Conclusion 5 Implementation 5.1 High-Level Design Decisions 5.1.1 Communication Topology 5.1.2 Constraint Evaluation 5.2 Synchronization Constraints 5.3 Synchronizer Instantiation and Representation 5.4 Constraint and Trigger Evaluation 5.4.1 Information Flow 5.4.2 Communication Protocols 5.4.3 Deadlocks 5.5 Pseudocode 5.5.1 Evaluating Disabling Constraints 5.5.2 Constraint Servers 5.5.3 Evaluating Atomicity Constraints 5.5.4 Evaluating Disabling and Atomicity Constraints 5.5.5 Discussion 5.6 Serializability 5.7 Fairness 5.7.1 Weak Fairness 5.7.2 Strong Fairness 5.7.3 Our Notion of Fairness 5.8 Message Complexity 5.9 Performance 5.10 Possible Extensions 5.10.1 Migration 5.10.2 Fault Tolerance 5.10.3 Garbage Collection 5.11 Alternatives 5.11.1 Communication with Constraint Servers 5.11.2 Deadlocks 5.11.3 Concurrent Check Actions 5.11.4 Optimistic Concurrency Control 5.11.5 Distributed Mutual Exclusion 5.12 Conclusion 6 Conclusion Glossary References Name Index A B C D E F G H I J K L M N O P R S T V W Y Z Subject Index A B C D E F G H I K L M N O P R S T V W __Coordinating Distributed Objects__ presents a novel object-oriented methodology to simplify the construction of distributed software systems. The methodology is based on a programming construct, called synchronizer, that allows the coordination of distributed application components to be programmed in a modular fashion and at a high level of abstraction. The methodology offers new insight into the problem of coordination in distributed systems and can be applied to a broad spectrum of distributed software systems such as process control, multimedia, and groupware. Synchronizers offer other attractions as well: they maintain procedural abstraction, data encapsulation, and inherent concurrency. Overall, they allow coordination to be expressed at a level of abstraction that is much closer to the mental model of code developers.