当前位置: 首页 > 面试题库 >

为什么单个Jedis实例不是线程安全的?

车胤运
2023-03-14
问题内容

https://github.com/xetorthio/jedis/wiki/入门

在多线程环境中使用Jedis

您不应该使用来自不同线程的相同实例,因为您会遇到奇怪的错误。有时创建大量的Jedis实例还不够好,因为这意味着大量的套接字和连接,这也会导致奇怪的错误。

单个Jedis实例不是线程安全的

!为避免这些问题,应使用JedisPool,它是网络连接的线程安全池。给定完成后将Jedis实例返回到池中,可以使用该池可靠地创建多个Jedis实例。这样,您可以克服这些奇怪的错误并获得出色的性能。

==================================================

我想知道为什么吗?谁能帮我


问题答案:

单个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并获得更好的性能;或者,如果您具有html" target="_blank">多线程环境,则可以使用JedisPool并获得线程安全。



 类似资料:
  • 问题内容: 请用代码示例说明为什么SimpleDateFormat不是线程安全的。这节课有什么问题? 是SimpleDateFormat的格式功能问题吗?请提供一个在课堂上演示此错误的代码。 FastDateFormat是线程安全的。为什么?SimpleDateFormat和FastDateFormat有什么区别? 请用代码说明这个问题? 问题答案: 将中间结果存储在实例字段中。因此,如果两个线程

  • 问题内容: 如标题所述,为什么静态嵌套类单例线程安全? 问题答案: 您显示的代码在技术上不是线程安全的。这种狡猾的代码通常会造成混乱。 该代码应如下所示: 在这里,我们在()的静态初始化程序中进行分配,任何以正确 的事前发生 关系访问它的线程都可以看到它。嵌套类没有什么特别的,它只允许使用外部类而无需立即构造单例对象。几乎可以肯定,这是完全 没有意义的,但似乎可以使某些人满意。 和以往一样,[ 可

  • 我看到了不同的PHP二进制文件,比如非线程或线程安全? 这是什么意思? 这些软件包之间有什么区别?

  • 问题内容: 我看过的利弊一些文章,并在Java编程语言。在其中一篇文章中,作者提到: StringBuilder 不是 线程安全的 ,因此在 多个线程中 使用 StringBuffer 。 不幸的是,我不明白这意味着什么。你能解释一下之间的区别,以及特别是在“线程安全”的环境。 如果您可以使用代码示例进行描述,我将不胜感激。 问题答案: 如果多个线程正在修改a的相同实例,则结果可能是意外的- 即某

  • 我们都知道查询不应该在UI线程上执行,但是,令人惊讶的是,我在官方文档中找不到有关类的线程安全性的信息。 我知道如何编写线程安全的,并且我知道默认情况下是线程安全的(它实现了内部锁定机制)。 但是,从多个线程使用的单个实例安全吗(例如,在同一对象上并行调用或?

  • 我在多线程环境中做的工作很少。所以,我需要知道below类的getInstance函数是否是线程安全的。这是单例类: 在getInstance函数(未注释)中,返回静态对象的引用。它需要线程安全机制吗? 在第二个getInstance(注释)中,如果singleObject为null,我们就创建对象。所以,它需要锁定机制,需要同步,对吧?