...
This noncompliant code example shows a thread-safe variant of the SocketReader class that creates a Socket per thread, that is, the socket is not shared amongst multiple threads. This is a common scenario in server applications that must accept connections and requests and dispatch them to different handling threadsplace requests to several servers simultaneously, without using any locking.
| Code Block | ||
|---|---|---|
| ||
// Thread-safe SocketReader public class SocketReader implements Runnable { private final String host; private final int port; SocketReader(String host, int port) { this.host = host; this.port = port; } public void run() { Socket socket = null; try { socket = new Socket("somehost"host, 25port); } catch (UnknownHostException e) { // Forward to handler } catch (IOException e) { // Forward to handler } // Do some useful work } } |
...
| Code Block | ||
|---|---|---|
| ||
class SocketReader implements Runnable {
private static ThreadLocal<Socket> connectionHolder = new ThreadLocal<Socket>() {
Socket socket = null;
@Override public Socket initialValue() {
try {
socket = new Socket("somehostdefaultHost", 25"defaultPort");
} catch (UnknownHostException e) {
// Forward to handler
} catch (IOException e) {
// Forward to handler
}
return socket;
}
@Override public void set(Socket sock) {
if(sock == null) { // Shuts down socket when null value is passed
try {
socket.close();
} catch (IOException e) {
// Forward to handler
}
} else {
socket = sock; // Assigns Socket with caller specified hostname and port
}
}
};
public static Socket getSocketConnection() {
return connectionHolder.get();
}
public static void shutdownSocket() { // Allows client to close socket anytime
connectionHolder.set(null);
}
public void run() {
Socket socket = getSocketConnection();
// Do some useful work
}
}
|
...