// Copyright 2014 The Bazel Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.devtools.build.lib.concurrent; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Define some standard attributes for documenting thread safety properties. *<p> * The names used here are adapted from those used in Joshua Bloch's book * "Effective Java", which are also described at * <http://www.ibm.com/developerworks/java/library/j-jtp09263/>. *<p> * These attributes are just documentation. They don't have any run-time * effect. The main aim is mainly just to standardize the terminology. * (However, if this catches on, I can also imagine in the future having * a presubmit check that checks that all new classes have thread safety * annotations :) *<p> * See ThreadSafetyTest for examples of how these attributes should be used. */ public class ThreadSafety { /** * The Immutable attribute indicates that instances of the class are * immutable, or at least appear that way are far as their external API * is concerned. Immutable classes are usually also ThreadSafe, * but can be ThreadHostile if they perform unsynchronized access to * mutable static data. (We deviate from Bloch's nomenclature by * not assuming that Immutable implies ThreadSafe; developers should * explicitly annotate classes as both Immutable and ThreadSafe when * appropriate.) */ @Documented @Target(value = {ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Immutable {} /** * The ThreadSafe attribute marks a class or method which can safely be used * from multiple threads without any need for external synchronization. * * When applied to a class, this attribute indicates that instances * of the class can safely be used concurrently from multiple threads * without any need for external synchronization, i.e. that all non-static methods * are thread-safe (except any private methods that are explicitly * annotated with a different thread safety annotation). In addition it * also indicates that all non-static nested classes are thread-safe (except any private * nested classes that are explicitly annotated with a different thread * safety annotation). Note that no guarantees are made about static class methods or static * nested classes - they should be annotated separately. * * When applied to a method, this attribute indicates that the * method can safely be called concurrently from multiple threads. * The implementation must synchronize any accesses to mutable data. */ @Documented @Target(value = {ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.SOURCE) public @interface ThreadSafe {} /** * The ThreadCompatible attribute marks a class or method that * is thread-safe provided that only one thread attempts to * access each object at a time. * * The implementation of such a class must synchronize accesses * to mutable static data, but can assume that each instance will * only be accessed from one thread at a time. * * The client must obtain an appropriate lock before calling ThreadCompatible * methods, or must otherwise ensure that only one thread calls such methods. * Unless otherwise specified, an appropriate lock means synchronizing on the * instance. * * A ThreadCompatible class may contain private methods or private nested * classes that are not ThreadCompatible provided that they are explicitly * annotated with a different thread safety annotation. */ @Documented @Target(value = {ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.SOURCE) public @interface ThreadCompatible {} /** * The ThreadHostile attribute marks a class or method that * can't safely be used by multiple threads, for example because * it performs unsynchronized access to mutable static objects. */ @Documented @Target(value = {ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.SOURCE) public @interface ThreadHostile {} /** * The ConditionallyThreadSafe attribute marks a class that contains * some methods (or nested classes) which are ThreadSafe but others which are * only ThreadCompatible or ThreadHostile. * * The methods (and nested classes) of a ConditionallyThreadSafe class should * each have their thread safety marked. */ @Documented @Target(value = {ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.SOURCE) public @interface ConditionallyThreadSafe {} /** * The ConditionallyThreadCompatible attribute marks a class that contains * some methods (or nested classes) which are ThreadCompatible but others * which are ThreadHostile. * * The methods (and nested classes) of a ConditionallyThreadCompatible class * should each have their thread safety marked. */ @Documented @Target(value = {ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.SOURCE) public @interface ConditionallyThreadCompatible {} }