Una singola istanza Jedis non è threadsafe perché è stata implementata in questo modo. Questa è la decisione presa dall'autore della libreria.
Puoi controllare il codice sorgente di BinaryJedis che è un super tipo di Jedis https://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/BinaryJedis.java
Ad esempio queste righe:
public Transaction multi() {
client.multi();
client.getOne(); // expected OK
transaction = new Transaction(client);
return transaction;
}
Come puoi vedere, il campo della transazione è condiviso per tutti i thread utilizzando l'istanza Jedis e inizializzato in questo metodo. Successivamente questa transazione può essere utilizzata in altri metodi. Immagina che due thread eseguano operazioni transazionali contemporaneamente. Il risultato potrebbe essere che a una transazione creata da un thread si accede involontariamente da un altro thread. Il campo della transazione in questo caso è l'accesso allo stato condiviso a cui non è sincronizzato. Questo rende Jedis non thread-safe.
Il motivo per cui l'autore ha deciso di rendere Jedis non threadsafe e JedisPool threadsafe potrebbe essere quello di fornire flessibilità ai client in modo che se si dispone di un ambiente a thread singolo è possibile utilizzare Jedis e ottenere prestazioni migliori o se si dispone di un ambiente multithread è possibile utilizzare JedisPool e ottieni la sicurezza dei thread.