Annotation Type ThreadSafeTypeParameter
When a
ThreadSafe
class has type parameters, annotating a parameter with
ThreadSafeTypeParameter
enforces that declarations of this class must, for that type parameter,
use a type that is itself thread-safe.
Additionally, only type parameters that are annotated with ThreadSafeTypeParameter
can
be used as field types that are not @GuardedBy
.
In more detail, consider this (valid) class:
@ThreadSafe class MyThreadSafeClass<A, B, @ThreadSafeTypeParameter C> {
@GuardedBy("this") B b;
final C c;
MyThreadSafeClass(B b, C c) {
this.b = b;
this.c = c;
}
}
Each of these three type parameters is valid for a different reason: type parameter A
is
ok because it is simply not used as the type of a field; type parameter B
is ok because
it is used as the type of a field that is declared to be @GuardedBy
; finally, type
parameter C
is ok because it is annotated with ThreadSafeTypeParameter
.
Furthermore, the declaration MyThreadSafeClass<Object, Object, String>
is valid, since
the type parameter C
(i.e., String
) is thread-safe, whereas a declaration
MyThreadSafeClass<Object, Object, Object>
would result in a compiler error.
Note: the ThreadSafeTypeParameter
annotation has a secondary use case. If you annotate
a type parameter of a method, then callers to that method are only allowed to pass in a type that
is deemed thread-safe. For example, given the method declaration static
<@ThreadSafeTypeParameter T> void foo(T foo) {}
, a call to foo
must pass a parameter
that is deemed thread-safe.