diff --git a/api/src/main/java/io/grpc/Channel.java b/api/src/main/java/io/grpc/Channel.java index 60ff76ff082..e2787eb2f26 100644 --- a/api/src/main/java/io/grpc/Channel.java +++ b/api/src/main/java/io/grpc/Channel.java @@ -16,7 +16,6 @@ package io.grpc; -import javax.annotation.concurrent.ThreadSafe; /** * A virtual connection to a conceptual endpoint, to perform RPCs. A channel is free to have zero or @@ -29,8 +28,9 @@ * implementations using {@link ClientInterceptor}. It is expected that most application * code will not use this class directly but rather work with stubs that have been bound to a * Channel that was decorated during application initialization. + * + *
This class is thread-safe. */ -@ThreadSafe public abstract class Channel { /** * Create a {@link ClientCall} to the remote operation specified by the given diff --git a/api/src/main/java/io/grpc/ChannelLogger.java b/api/src/main/java/io/grpc/ChannelLogger.java index ce654ec9d5b..2cdf4c84724 100644 --- a/api/src/main/java/io/grpc/ChannelLogger.java +++ b/api/src/main/java/io/grpc/ChannelLogger.java @@ -16,15 +16,15 @@ package io.grpc; -import javax.annotation.concurrent.ThreadSafe; /** * A Channel-specific logger provided by GRPC library to {@link LoadBalancer} implementations. * Information logged here goes to Channelz, and to the Java logger of this class * as well. + * + *
This class is thread-safe. */ @ExperimentalApi("https://github.com/grpc/grpc-java/issues/5029") -@ThreadSafe public abstract class ChannelLogger { /** * Log levels. See the table below for the mapping from the ChannelLogger levels to Channelz diff --git a/api/src/main/java/io/grpc/ClientInterceptor.java b/api/src/main/java/io/grpc/ClientInterceptor.java index c27c31c8474..d6c8cd7e6fb 100644 --- a/api/src/main/java/io/grpc/ClientInterceptor.java +++ b/api/src/main/java/io/grpc/ClientInterceptor.java @@ -16,7 +16,6 @@ package io.grpc; -import javax.annotation.concurrent.ThreadSafe; /** * Interface for intercepting outgoing calls before they are dispatched by a {@link Channel}. @@ -37,8 +36,10 @@ * without completing the previous ones first. Refer to the * {@link io.grpc.ClientCall.Listener ClientCall.Listener} docs for more details regarding thread * safety of the returned listener. + * + *
This is thread-safe and should be considered + * for the errorprone ThreadSafe annotation in the future. */ -@ThreadSafe public interface ClientInterceptor { /** * Intercept {@link ClientCall} creation by the {@code next} {@link Channel}. diff --git a/api/src/main/java/io/grpc/ClientStreamTracer.java b/api/src/main/java/io/grpc/ClientStreamTracer.java index 42e1fdfebea..8e11e781e7c 100644 --- a/api/src/main/java/io/grpc/ClientStreamTracer.java +++ b/api/src/main/java/io/grpc/ClientStreamTracer.java @@ -19,13 +19,13 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.base.MoreObjects; -import javax.annotation.concurrent.ThreadSafe; /** * {@link StreamTracer} for the client-side. + * + *
This class is thread-safe. */ @ExperimentalApi("https://github.com/grpc/grpc-java/issues/2861") -@ThreadSafe public abstract class ClientStreamTracer extends StreamTracer { /** * Indicates how long the call was delayed, in nanoseconds, due to waiting for name resolution diff --git a/api/src/main/java/io/grpc/HandlerRegistry.java b/api/src/main/java/io/grpc/HandlerRegistry.java index 4aaf0114fb1..148573ada9a 100644 --- a/api/src/main/java/io/grpc/HandlerRegistry.java +++ b/api/src/main/java/io/grpc/HandlerRegistry.java @@ -19,12 +19,12 @@ import java.util.Collections; import java.util.List; import javax.annotation.Nullable; -import javax.annotation.concurrent.ThreadSafe; /** * Registry of services and their methods used by servers to dispatching incoming calls. + * + *
This class is thread-safe. */ -@ThreadSafe public abstract class HandlerRegistry { /** diff --git a/api/src/main/java/io/grpc/LoadBalancer.java b/api/src/main/java/io/grpc/LoadBalancer.java index 3187ae8ef1b..ae83af2804c 100644 --- a/api/src/main/java/io/grpc/LoadBalancer.java +++ b/api/src/main/java/io/grpc/LoadBalancer.java @@ -32,7 +32,6 @@ import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.NotThreadSafe; -import javax.annotation.concurrent.ThreadSafe; /** * A pluggable component that receives resolved addresses from {@link NameResolver} and provides the @@ -64,7 +63,7 @@ * allows implementations to schedule tasks to be run in the same Synchronization Context, with or * without a delay, thus those tasks don't need to worry about synchronizing with the balancer * methods. - * + * *
However, the actual running thread may be the network thread, thus the following rules must be * followed to prevent blocking or even dead-locking in a network: * @@ -417,7 +416,7 @@ public void handleSubchannelState( * *
This method should always return a constant value. It's not specified when this will be * called. - * + * *
Note that this method is only called when implementing {@code handleResolvedAddresses()} * instead of {@code acceptResolvedAddresses()}. * @@ -450,7 +449,6 @@ public void requestConnection() {} * * @since 1.2.0 */ - @ThreadSafe @ExperimentalApi("https://github.com/grpc/grpc-java/issues/1771") public abstract static class SubchannelPicker { /** @@ -640,7 +638,7 @@ private PickResult( * stream is created at all in some cases. * @since 1.3.0 */ - // TODO(shivaspeaks): Need to deprecate old APIs and create new ones, + // TODO(shivaspeaks): Need to deprecate old APIs and create new ones, // per https://github.com/grpc/grpc-java/issues/12662. public static PickResult withSubchannel( Subchannel subchannel, @Nullable ClientStreamTracer.Factory streamTracerFactory) { @@ -1030,9 +1028,10 @@ public String toString() { /** * Provides essentials for LoadBalancer implementations. * + *
This class is thread-safe. + * * @since 1.2.0 */ - @ThreadSafe @ExperimentalApi("https://github.com/grpc/grpc-java/issues/1771") public abstract static class Helper { /** @@ -1332,7 +1331,7 @@ public MetricRecorder getMetricRecorder() { } /** - * A logical connection to a server, or a group of equivalent servers represented by an {@link + * A logical connection to a server, or a group of equivalent servers represented by an {@link * EquivalentAddressGroup}. * *
It maintains at most one physical connection (aka transport) for sending new RPCs, while @@ -1551,9 +1550,10 @@ public interface SubchannelStateListener { /** * Factory to create {@link LoadBalancer} instance. * + *
This class is thread-safe. + * * @since 1.2.0 */ - @ThreadSafe @ExperimentalApi("https://github.com/grpc/grpc-java/issues/1771") public abstract static class Factory { /** diff --git a/api/src/main/java/io/grpc/ManagedChannel.java b/api/src/main/java/io/grpc/ManagedChannel.java index 7875fdb57f2..2b1d89946bf 100644 --- a/api/src/main/java/io/grpc/ManagedChannel.java +++ b/api/src/main/java/io/grpc/ManagedChannel.java @@ -17,12 +17,12 @@ package io.grpc; import java.util.concurrent.TimeUnit; -import javax.annotation.concurrent.ThreadSafe; /** * A {@link Channel} that provides lifecycle management. + * + *
This class is thread-safe. */ -@ThreadSafe public abstract class ManagedChannel extends Channel { /** * Initiates an orderly shutdown in which preexisting calls continue but new calls are immediately diff --git a/api/src/main/java/io/grpc/NameResolver.java b/api/src/main/java/io/grpc/NameResolver.java index e44a26309ae..80bc338d86b 100644 --- a/api/src/main/java/io/grpc/NameResolver.java +++ b/api/src/main/java/io/grpc/NameResolver.java @@ -35,7 +35,6 @@ import java.util.concurrent.ScheduledExecutorService; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; -import javax.annotation.concurrent.ThreadSafe; /** * A pluggable component that resolves a target {@link URI} and return addresses to the caller. @@ -78,7 +77,7 @@ public abstract class NameResolver { * Starts the resolution. The method is not supposed to throw any exceptions. That might cause the * Channel that the name resolver is serving to crash. Errors should be propagated * through {@link Listener#onError}. - * + * *
An instance may not be started more than once, by any overload of this method, even after * an intervening call to {@link #shutdown}. * @@ -114,7 +113,7 @@ public void onResult(ResolutionResult resolutionResult) { * Starts the resolution. The method is not supposed to throw any exceptions. That might cause the * Channel that the name resolver is serving to crash. Errors should be propagated * through {@link Listener2#onError}. - * + * *
An instance may not be started more than once, by any overload of this method, even after * an intervening call to {@link #shutdown}. * @@ -215,10 +214,11 @@ public NameResolver newNameResolver(Uri targetUri, final Args args) { * *
All methods are expected to return quickly. * + *
This interface is thread-safe. + * * @since 1.0.0 */ @ExperimentalApi("https://github.com/grpc/grpc-java/issues/1770") - @ThreadSafe public interface Listener { /** * Handles updates on resolved addresses and attributes. diff --git a/api/src/main/java/io/grpc/Server.java b/api/src/main/java/io/grpc/Server.java index 97ea06a81c2..97c4d495b8a 100644 --- a/api/src/main/java/io/grpc/Server.java +++ b/api/src/main/java/io/grpc/Server.java @@ -21,13 +21,13 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; -import javax.annotation.concurrent.ThreadSafe; /** * Server for listening for and dispatching incoming calls. It is not expected to be implemented by * application code or interceptors. + * + *
This class is thread-safe. */ -@ThreadSafe public abstract class Server { /** diff --git a/api/src/main/java/io/grpc/ServerCallHandler.java b/api/src/main/java/io/grpc/ServerCallHandler.java index fdfa9997957..7d7d8217300 100644 --- a/api/src/main/java/io/grpc/ServerCallHandler.java +++ b/api/src/main/java/io/grpc/ServerCallHandler.java @@ -16,13 +16,12 @@ package io.grpc; -import javax.annotation.concurrent.ThreadSafe; - /** * Interface to initiate processing of incoming remote calls. Advanced applications and generated * code will implement this interface to allows {@link Server}s to invoke service methods. + * + *
This interface is thread-safe.
*/
-@ThreadSafe
public interface ServerCallHandler This interface is thread-safe.
*/
-@ThreadSafe
public interface ServerInterceptor {
/**
* Intercept {@link ServerCall} dispatch by the {@code next} {@link ServerCallHandler}. General
diff --git a/api/src/main/java/io/grpc/ServerStreamTracer.java b/api/src/main/java/io/grpc/ServerStreamTracer.java
index d522610ab3a..81691642131 100644
--- a/api/src/main/java/io/grpc/ServerStreamTracer.java
+++ b/api/src/main/java/io/grpc/ServerStreamTracer.java
@@ -17,13 +17,13 @@
package io.grpc;
import javax.annotation.Nullable;
-import javax.annotation.concurrent.ThreadSafe;
/**
* Listens to events on a stream to collect metrics.
+ *
+ * This class is thread-safe.
*/
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/2861")
-@ThreadSafe
public abstract class ServerStreamTracer extends StreamTracer {
/**
* Called before the interceptors and the call handlers and make changes to the Context object
diff --git a/api/src/main/java/io/grpc/StreamTracer.java b/api/src/main/java/io/grpc/StreamTracer.java
index 66b3de8be6b..251e6e2b49f 100644
--- a/api/src/main/java/io/grpc/StreamTracer.java
+++ b/api/src/main/java/io/grpc/StreamTracer.java
@@ -16,15 +16,14 @@
package io.grpc;
-import javax.annotation.concurrent.ThreadSafe;
-
/**
* Listens to events on a stream to collect metrics.
*
* DO NOT MOCK: Use TestStreamTracer. Mocks are not thread-safe
+ *
+ * This class is thread-safe.
*/
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/2861")
-@ThreadSafe
public abstract class StreamTracer {
/**
* Stream is closed. This will be called exactly once.
diff --git a/binder/src/main/java/io/grpc/binder/internal/BinderTransport.java b/binder/src/main/java/io/grpc/binder/internal/BinderTransport.java
index 30b8735ac68..2b7aa97bfd9 100644
--- a/binder/src/main/java/io/grpc/binder/internal/BinderTransport.java
+++ b/binder/src/main/java/io/grpc/binder/internal/BinderTransport.java
@@ -54,7 +54,6 @@
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Nullable;
-import javax.annotation.concurrent.ThreadSafe;
/**
* Base class for binder-based gRPC transport.
@@ -76,8 +75,9 @@
*
* IMPORTANT: This implementation must comply with this published wire format.
* https://github.com/grpc/proposal/blob/master/L73-java-binderchannel/wireformat.md
+ *
+ * This class is thread-safe.
*/
-@ThreadSafe
public abstract class BinderTransport implements IBinder.DeathRecipient {
private static final Logger logger = Logger.getLogger(BinderTransport.class.getName());
diff --git a/core/src/main/java/io/grpc/internal/ClientTransport.java b/core/src/main/java/io/grpc/internal/ClientTransport.java
index fd0f30b8bf1..3e2c2aea247 100644
--- a/core/src/main/java/io/grpc/internal/ClientTransport.java
+++ b/core/src/main/java/io/grpc/internal/ClientTransport.java
@@ -24,15 +24,15 @@
import io.grpc.MethodDescriptor;
import io.grpc.Status;
import java.util.concurrent.Executor;
-import javax.annotation.concurrent.ThreadSafe;
/**
* The client-side transport typically encapsulating a single connection to a remote
* server. However, streams created before the client has discovered any server address may
* eventually be issued on different connections. All methods on the transport and its callbacks
* are expected to execute quickly.
+ *
+ * This interface is thread-safe.
*/
-@ThreadSafe
public interface ClientTransport extends InternalInstrumented This interface is thread-safe.
*/
-@ThreadSafe
public interface ConnectionClientTransport extends ManagedClientTransport {
/**
* Returns a set of attributes, which may vary depending on the state of the transport. The keys
diff --git a/core/src/main/java/io/grpc/internal/InternalServer.java b/core/src/main/java/io/grpc/internal/InternalServer.java
index a6079081233..8449f352b17 100644
--- a/core/src/main/java/io/grpc/internal/InternalServer.java
+++ b/core/src/main/java/io/grpc/internal/InternalServer.java
@@ -22,13 +22,13 @@
import java.net.SocketAddress;
import java.util.List;
import javax.annotation.Nullable;
-import javax.annotation.concurrent.ThreadSafe;
/**
* An object that accepts new incoming connections on one or more listening socket addresses.
* This would commonly encapsulate a bound socket that {@code accept()}s new connections.
+ *
+ * This interface is thread-safe.
*/
-@ThreadSafe
public interface InternalServer {
/**
* Starts transport. Implementations must not call {@code listener} until after {@code start()}
diff --git a/core/src/main/java/io/grpc/internal/KeepAliveManager.java b/core/src/main/java/io/grpc/internal/KeepAliveManager.java
index 535b3a82524..1937da6f467 100644
--- a/core/src/main/java/io/grpc/internal/KeepAliveManager.java
+++ b/core/src/main/java/io/grpc/internal/KeepAliveManager.java
@@ -27,7 +27,6 @@
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
-import javax.annotation.concurrent.ThreadSafe;
/**
* Manages keepalive pings.
@@ -268,8 +267,8 @@ public static final class ClientKeepAlivePinger implements KeepAlivePinger {
/**
* A {@link ClientTransport} that has life-cycle management.
*
+ * This interface is thread-safe.
*/
- @ThreadSafe
public interface TransportWithDisconnectReason extends ClientTransport {
/**
@@ -308,4 +307,3 @@ public void onPingTimeout() {
}
}
}
-
diff --git a/core/src/main/java/io/grpc/internal/ManagedClientTransport.java b/core/src/main/java/io/grpc/internal/ManagedClientTransport.java
index 8350a005409..99a3bd1eceb 100644
--- a/core/src/main/java/io/grpc/internal/ManagedClientTransport.java
+++ b/core/src/main/java/io/grpc/internal/ManagedClientTransport.java
@@ -20,7 +20,6 @@
import io.grpc.Attributes;
import io.grpc.Status;
import javax.annotation.Nullable;
-import javax.annotation.concurrent.ThreadSafe;
/**
* A {@link ClientTransport} that has life-cycle management.
@@ -32,8 +31,9 @@
* implementations may transfer the streams to somewhere else. Either way they must conform to the
* contract defined by {@link #shutdown}, {@link Listener#transportShutdown} and
* {@link Listener#transportTerminated}.
+ *
+ * This interface is thread-safe.
*/
-@ThreadSafe
public interface ManagedClientTransport extends ClientTransport {
/**
diff --git a/core/src/main/java/io/grpc/internal/ObjectPool.java b/core/src/main/java/io/grpc/internal/ObjectPool.java
index 13547bc274a..5589cbbdf3c 100644
--- a/core/src/main/java/io/grpc/internal/ObjectPool.java
+++ b/core/src/main/java/io/grpc/internal/ObjectPool.java
@@ -16,12 +16,11 @@
package io.grpc.internal;
-import javax.annotation.concurrent.ThreadSafe;
-
/**
* An object pool.
+ *
+ * This interface is thread-safe.
*/
-@ThreadSafe
public interface ObjectPool DO NOT MOCK: Customizing options doesn't work properly in mocks. Use InProcessChannelBuilder
* to create a real channel suitable for testing. It is also possible to mock Channel instead.
*
+ * This class is thread-safe.
+ *
* @since 1.26.0
*/
-@ThreadSafe
@CheckReturnValue
public abstract class AbstractAsyncStub DO NOT MOCK: Customizing options doesn't work properly in mocks. Use InProcessChannelBuilder
* to create a real channel suitable for testing. It is also possible to mock Channel instead.
*
+ * This class is thread-safe.
+ *
* @since 1.26.0
*/
-@ThreadSafe
@CheckReturnValue
public abstract class AbstractBlockingStub DO NOT MOCK: Customizing options doesn't work properly in mocks. Use InProcessChannelBuilder
* to create a real channel suitable for testing. It is also possible to mock Channel instead.
*
+ * This class is thread-safe.
+ *
* @since 1.26.0
*/
-@ThreadSafe
@CheckReturnValue
public abstract class AbstractFutureStub DO NOT MOCK: Customizing options doesn't work properly in mocks. Use InProcessChannelBuilder
* to create a real channel suitable for testing. It is also possible to mock Channel instead.
*
+ * This class is thread-safe.
+ *
* @since 1.0.0
* @param > extends AbstractStub {
diff --git a/stub/src/main/java/io/grpc/stub/AbstractBlockingStub.java b/stub/src/main/java/io/grpc/stub/AbstractBlockingStub.java
index 4bdb3c0bb94..49ecd1fca40 100644
--- a/stub/src/main/java/io/grpc/stub/AbstractBlockingStub.java
+++ b/stub/src/main/java/io/grpc/stub/AbstractBlockingStub.java
@@ -20,7 +20,6 @@
import io.grpc.CallOptions;
import io.grpc.Channel;
import io.grpc.stub.ClientCalls.StubType;
-import javax.annotation.concurrent.ThreadSafe;
/**
* Stub implementations for blocking stubs.
@@ -28,9 +27,10 @@
* >
extends AbstractStub {
diff --git a/stub/src/main/java/io/grpc/stub/AbstractFutureStub.java b/stub/src/main/java/io/grpc/stub/AbstractFutureStub.java
index 5e37b1e4915..4aede0dcbbe 100644
--- a/stub/src/main/java/io/grpc/stub/AbstractFutureStub.java
+++ b/stub/src/main/java/io/grpc/stub/AbstractFutureStub.java
@@ -20,7 +20,6 @@
import io.grpc.CallOptions;
import io.grpc.Channel;
import io.grpc.stub.ClientCalls.StubType;
-import javax.annotation.concurrent.ThreadSafe;
/**
* Stub implementations for future stubs.
@@ -28,9 +27,10 @@
* > extends AbstractStub {
diff --git a/stub/src/main/java/io/grpc/stub/AbstractStub.java b/stub/src/main/java/io/grpc/stub/AbstractStub.java
index 697107760db..409f1e7ed53 100644
--- a/stub/src/main/java/io/grpc/stub/AbstractStub.java
+++ b/stub/src/main/java/io/grpc/stub/AbstractStub.java
@@ -32,7 +32,6 @@
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import javax.annotation.Nullable;
-import javax.annotation.concurrent.ThreadSafe;
import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement;
/**
@@ -46,10 +45,11 @@
* the concrete type of this stub.
*/
-@ThreadSafe
@CheckReturnValue
public abstract class AbstractStub> {
private final Channel channel;