Ваша проблема правильна, потому что объект Socket
(как и любой другой объект в Java) передается по ссылке, поэтому существует вероятность того, что на него будут ссылаться разные модули или разные потоки, что приведет к непредсказуемому поведению.
Однако в случае вашей программы проблем нет.Причина в том, что всякий раз, когда сервер принимает новое соединение, он создает новый Socket
объект, который вы затем передаете в новый экземпляр ClientHandler
.Поэтому каждое новое соединение от клиента будет обслуживаться независимым экземпляром ClientHandler
, поэтому нет никаких условий гонки для объекта Socket
, о которых следует беспокоиться.Так что пока вы в безопасности.
В качестве контр-примера, если вы решили создать два ClientHandler
потока для чтения из того же Socket
объекта, подобного этому ...
s = server.accept();
ClientHandler ch = new ClientHandler(s);
ClientHandler ch2 = new ClientHandler(s);
new Thread(ch).start();
new Thread(ch2).start();
... тогда у вас могут быть проблемы, потому что два ClientHandler
s получат одинаковую ссылку на тот же Socket
объект, и если оба попытаютсядля чтения из одного сокета они получат только половину данных.Например, если вы получаете строку "hello"
, вы можете получить ch
с чтением "hel"
и ch2
с чтением "lo"
или любую другую комбинацию.