开发者社区> 问答> 正文

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

蛮大人123 2016-02-05 10:29:35 14018

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都继续尝试去获取锁,就在这个时候抛出个类型转换异常。

NoSQL Redis
分享到
取消 提交回答
全部回答(3)
  • 老码老吗
    2019-07-17 18:37:39

    多线程造成的,换成单线程操作,或者使用新连接操作。

    1 0
  • 白宸
    2019-07-17 18:37:39

    这个一般是协议出错 请检查下有没有多线程使用同一个redis链接的情况 如果有这个是会出错的

    0 0
  • 蛮大人123
    2019-07-17 18:37:39

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

    0 0
添加回答
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

推荐文章
相似问题
推荐课程