This article presents a novel cost analysis framework for concurrent objects. Concurrent objects form a wellestablished model for distributed concurrent systems. In this model, objects are the concurrency units that communicate among them via asynchronous method calls. Cost analysis aims at automatically approximating the resource consumption of executing a program in terms of its input parameters. While cost analysis for sequential programming languages has received considerable attention, concurrency and distribution have been notably less studied. The main challenges of cost analysis in a concurrent setting are as follows. First, inferring precise size abstractions for data in the program in the presence of shared memory. This information is essential for bounding the number of iterations of loops. Second, distribution suggests that analysis must infer the cost of the diverse distributed components separately. We handle this by means of a novel form of object-sensitive recurrence equations that use cost centres in order to keep the resource usage assigned to the different components separate. We have implemented our analysis and evaluated it on several small applications that are classical examples of concurrent and distributed programming. consider different types of resources of interest. For instance, we can measure traditional cost measures like number of executed instructions or memory consumption. In the former case, we will infer that 3 C elems .7 C hdRead inst C update inst / instructions will be executed. In the expression, elems corresponds to the maximum number of iterations of the loop; at each iteration, seven instructions are executed (the loop condition, the two increments, two method invocations, the get and the await), and the number of instructions of executing methods hdRead and update, denoted hdRead inst and update inst respectively, are added as well. For simplicity, we ignore here the values of the parameters. Besides, three instructions are executed outside the loop. The analysis will need to infer also the cost of the methods hdRead and update and plug them in the aforementioned expression. With regard to memory consumption, a new memory is not created in the loop; hence, we would output an expression of the form elems .hdRead heap C update heap / that relies on the memory created by the invoked methods (denoted hdRead heap and update heap ). Interestingly, we can also consider concurrency-related measures like the number of tasks spawned. In the aforementioned method, we spawn one task directly (but the method invocations might also spawn new tasks transitively). Therefore, we will compute an expression of the form elems .1ChdRead tasks Cupdate tasks / that relies on the number of tasks spawned by the calls to hdRead and update. Observe that the types of resources we have considered are platform independent (unlike WCET or energy consumption), that is, they can be inferred by inspecting the program, and the hardware on which the program will be executed can be ignored. Platform depend...