开发者社区> 问答> 正文

redis 多线程调用时抛出 [B cannot be cast to java.lang.Long 异常

Exception in thread "pool-1-thread-3" Exception in thread "pool-1-thread-2" java.lang.ClassCastException: [B cannot be cast to java.lang.Long
at redis.clients.jedis.Connection.getIntegerReply(Connection.java:222)
at redis.clients.jedis.Jedis.setnx(Jedis.java:370)
at com.github.jedis.lock.JedisLock.acquire(JedisLock.java:142)
at test.redis.MyMain.getValueByjedis(MyMain.java:41)
at test.redis.MyMain$1.run(MyMain.java:22)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
java.lang.ClassCastException: java.lang.Long cannot be cast to [B
at redis.clients.jedis.Connection.getBinaryBulkReply(Connection.java:216)
at redis.clients.jedis.Connection.getBulkReply(Connection.java:205)
at redis.clients.jedis.Jedis.get(Jedis.java:101)
at com.github.jedis.lock.JedisLock.acquire(JedisLock.java:148)
at test.redis.MyMain.getValueByjedis(MyMain.java:41)
at test.redis.MyMain$1.run(MyMain.java:22)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)

想用redis来做个分布式锁, 目前在实验中,就用多线程来模仿多台机器。
当两个线程跑的时候没有问题,再加一个线程 就抛异常了。
当t1成功获取锁的时候,t2 和t3都继续尝试去获取锁,就在这个时候抛出个类型转换异常。

展开
收起
蛮大人123 2016-02-05 10:29:35 26445 0
3 条回答
写回答
取消 提交回答
  • 多线程造成的,换成单线程操作,或者使用新连接操作。

    2019-07-17 18:37:39
    赞同 1 展开评论 打赏
  • 这个一般是协议出错 请检查下有没有多线程使用同一个redis链接的情况 如果有这个是会出错的

    2019-07-17 18:37:39
    赞同 展开评论 打赏
  • 我说我不帅他们就打我,还说我虚伪

    原因:多个线程同时调用了同一个jedis对象,导致内存数据被多个线程竞争,产生数据混乱
    解决方案:每个线程都new出一个自己的jedis对象。

    2019-07-17 18:37:39
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
ApsaraDB for Redis——与创客同行 立即下载
微博的Redis定制之路 立即下载
云数据库Redis版的开源之路 立即下载