Jedna instance Jedis není bezpečná pro vlákna, protože byla implementována tímto způsobem. To je rozhodnutí, které učinil autor knihovny.
Můžete zkontrolovat zdrojový kód BinaryJedis, což je super typ Jedisů https://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/BinaryJedis.java
Například tyto řádky:
public Transaction multi() {
client.multi();
client.getOne(); // expected OK
transaction = new Transaction(client);
return transaction;
}
Jak můžete vidět, pole transakce je sdíleno pro všechna vlákna pomocí instance Jedis a inicializováno touto metodou. Později může být tato transakce použita v jiných metodách. Představte si, že dvě vlákna provádějí transakční operace současně. Výsledkem může být, že k transakci vytvořené jedním vláknem neúmyslně přistoupí jiné vlákno. Pole transakce je v tomto případě sdíleným stavovým přístupem, který není synchronizován. Díky tomu nejsou Jedisové zabezpečeni proti vláknům.
Důvodem, proč se autor rozhodl učinit Jedis non-threadsafe a JedisPool threadsafe, může být poskytnutí flexibility pro klienty, takže pokud máte jednovláknové prostředí, můžete používat Jedis a získat lepší výkon, nebo pokud máte vícevláknové prostředí, které můžete použít JedisPool a získejte bezpečnost vláken.