The general disadvantage of this topology is the number of connections
required. The number of connections for the network of servers is equal
(n * n - n) / 2, where n is the number of servers. For example,
with 5 servers you need 10 connections, with 10 servers you need 45
connections, and with 50 servers you need 1225 connections. This is of
course the number of connections across the entire network, each
individual server only needs
n - 1 connections.
The handling of these sockets is all asynchronous Java NIO code which allows the server to handle many connections (all of them) with one thread. From a pure threading perspective, the option is extremely efficient with just one thread to listen and broadcast to many peers.
It is possible in this process that two servers learn of each other at the same time and each attempts to connect to the other simultaneously, resulting in two connections between the same two servers. When this happens both servers will detect the extra connection and one of the connections will be dropped and one will be kept. In practice this race condition rarely happens and can be avoided almost entirely by fanning out server startup by as little as 100 milliseconds.