单个Jedis实例不是线程安全的,因为它是通过这种方式实现的。那是图书馆作者做出的决定。
您可以签入BindisJedis的源代码,它是Jedis的超级类型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实例为所有线程共享事务字段,并在此方法中对其进行了初始化。稍后,该事务可用于其他方法。想象两个线程同时执行事务性操作。结果可能是一个线程创建的事务被另一线程无意访问。在这种情况下,事务字段是不同步的共享状态访问。这使Jedis成为非线程安全的。
作者之所以决定使Jedis为非线程安全的和JedisPool为线程安全的,可能是为了为客户端提供灵活性,这样,如果您具有单线程环境,则可以使用Jedis并获得更好的性能;或者,如果您具有多线程环境,则可以使用JedisPool并获得线程安全。



