Pojedyncza instancja Jedis nie jest bezpieczna wątkowo, ponieważ została zaimplementowana w ten sposób. Taką decyzję podjął autor biblioteki.
Możesz sprawdzić kod źródłowy BinaryJedis, który jest super typem Jedis https://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/BinaryJedis.java
Na przykład te wiersze:
public Transaction multi() {
client.multi();
client.getOne(); // expected OK
transaction = new Transaction(client);
return transaction;
}
Jak widać pole transakcji jest współdzielone dla wszystkich wątków korzystających z instancji Jedis i inicjowane w tej metodzie. Później transakcja ta może być wykorzystana w innych metodach. Wyobraź sobie, że dwa wątki wykonują jednocześnie operacje transakcyjne. Wynikiem może być to, że do transakcji utworzonej przez jeden wątek nieumyślnie uzyskuje dostęp inny wątek. Pole transakcji w tym przypadku to współdzielony dostęp do stanu, do którego nie jest synchronizowany. To sprawia, że Jedis nie jest bezpieczny dla wątków.
Powodem, dla którego autor zdecydował, aby Jedis nie był bezpieczny wątkowo i JedisPool bezpieczny wątkowo, może być zapewnienie elastyczności dla klientów, dzięki czemu jeśli masz środowisko jednowątkowe, możesz użyć Jedis i uzyskać lepszą wydajność lub jeśli masz środowisko wielowątkowe, z którego możesz korzystać JedisPool i uzyskaj bezpieczeństwo wątków.