On Mon, 6 Dec 2021 11:29:20 GMT, Aleksey Shipilev <sh...@openjdk.org> wrote:
>> There are several thread safety issues in java.net.ServerSocket, issues that >> go back to at least JDK 1.4. >> >> The issue of most concern is async close of a ServerSocket that is initially >> created unbound and where close may be called at or around the time the >> underlying SocketImpl is created or the socket is bound. >> >> The summary of the changes are: >> >> 1. The "impl" field is changed to be final field. >> 2. The closeLock is renamed to stateLock and is required to change the (now >> volatile) created, bound or closed fields. >> 3. The needless synchronization has been removed from xxxSoTimeout and >> xxxReceiveBufferSize. >> >> There are many redundant checks for isClosed() and other state that could be >> removed. Removing them would subtle change the exception thrown when there >> are two or more failure conditions. So they are left as is. > > src/java.base/share/classes/java/net/ServerSocket.java line 90: > >> 88: private volatile boolean created; // impl.create(boolean) called >> 89: private volatile boolean bound; >> 90: private volatile boolean closed; > > I don't see why these two need to be `volatile`, but we can keep them for > extra safety. isBound and isClose poll the state. ------------- PR: https://git.openjdk.java.net/jdk/pull/6712