単一のJedisインスタンスは、このように実装されているため、スレッドセーフではありません。それが図書館の作者が下した決定です。
JedisのスーパータイプであるBinaryJedisのソースコードをチェックインできますhttps://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/BinaryJedis.java
>例:これらの行:
public Transaction multi() {
client.multi();
client.getOne(); // expected OK
transaction = new Transaction(client);
return transaction;
}
ご覧のとおり、トランザクションフィールドはJedisインスタンスを使用してすべてのスレッドで共有され、このメソッドで初期化されます。後でこのトランザクションを他の方法で使用できます。 2つのスレッドが同時にトランザクション操作を実行するとします。その結果、あるスレッドによって作成されたトランザクションが、別のスレッドによって意図せずにアクセスされる可能性があります。この場合のトランザクションフィールドは、同期されていない共有状態アクセスです。これにより、Jedisはスレッドセーフではなくなります。
著者がJedisを非スレッドセーフおよびJedisPoolスレッドセーフにすることを決定した理由は、クライアントに柔軟性を提供して、シングルスレッド環境の場合はJedisを使用してパフォーマンスを向上させるか、マルチスレッド環境の場合は使用できるようにするためかもしれません。 JedisPoolとスレッドセーフを取得します。