运行2天左右,就会发生一次死锁
线程都在外面等着,进入不了try块内部
public void sapGoodsMove(String factoryCode, List<OdsRawMission> list, String oprType) { try { if (lock.tryLock(120, TimeUnit.SECONDS)) { // 尝试获取锁,最多等待120秒 try { List<OdsRawMission> orderRawMissions = new ArrayList<OdsRawMission>(); orderRawMissions = odsRawOrderTaskMapper.queryTransferList311(factoryCode,list); log.info(factoryCode+":交接完成待过账数据:{}条",orderRawMissions.size()); if(orderRawMissions.size()>0){ sap(sapHost,factoryCode,orderRawMissions); } } catch (Exception e) { log.error("原材料交接过账异常",e); } } else { log.info(factoryCode+":未抢到锁:" + list); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); // 保持中断状态 log.error("获取锁时被中断", e); } finally { if (lock.isHeldByCurrentThread()) { // 确保只有持有锁时才解锁 lock.unlock(); } } }
这是调用处的代码1
@Scheduled(cron = "0 0/15 * * * ?") public void executeGoodsMove() { log.info("task-raw-jiaojie-sap"); if (!Boolean.parseBoolean(enable)) { return; } if (profile.indexOf("russia") < 0) { String[] split = factoryCodes.split(","); for (String factoryCode : split) { ThreadPool.executeTask(() -> { try { dbCommon.execute(factoryCode); if (DictionaryConstant.PLANT_YDGC.contains(factoryCode)) {//印度工厂 postHandoverServiceIndia.sapGoodsMove(factoryCode, null,"task"); } } catch (Exception e) { e.printStackTrace(); log.error("原材料交接 过账异常:{}", e.getMessage()); } }); } } }
可以试试把锁放在业务逻辑之后立刻释放
public void sapGoodsMove(String factoryCode, List<OdsRawMission> list, String oprType) { try { if (lock.tryLock(120, TimeUnit.SECONDS)) { // 尝试获取锁,最多等待120秒 try { List<OdsRawMission> orderRawMissions = new ArrayList<OdsRawMission>(); orderRawMissions = odsRawOrderTaskMapper.queryTransferList311(factoryCode,list); log.info(factoryCode+":交接完成待过账数据:{}条",orderRawMissions.size()); if(orderRawMissions.size()>0){ sap(sapHost,factoryCode,orderRawMissions); } } catch (Exception e) { log.error("原材料交接过账异常",e); } finally { lock.unlock(); // 业务逻辑处理后立即释放锁 } } else { log.info(factoryCode+":未抢到锁:" + list); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); // 保持中断状态 log.error("获取锁时被中断", e); } }
问题内容: 我的应用程序在Linux上作为后台进程运行。当前在“终端”窗口的命令行中启动。 最近,一个用户执行该应用程序一段时间后,它神秘地死了。文本: 被杀 在航站楼上。这发生了两次。我问其他终端是否有人使用kill命令杀死进程?没有。 Linux在什么情况下会决定终止我的进程?我相信外壳程序显示为“ killed”,因为该进程在收到kill(9)信号后就死了。如果Linux发送了kill信号,
死锁描述了另外两个线程因为永远等待对方而被阻塞的情况。当死锁发生时,程序永远挂起,你唯一能做的就是杀死程序。 为什么在下面给出的示例生产者-消费者问题中没有发生死锁: 我想知道为什么当同步对象正在等待其他线程释放锁时,在同步块中调用等待方法不会导致死锁?
问题内容: 我有一个客户端服务器程序在服务器端使用套接字,并且读写发生在这种方式 同样在cilent(android)方面… 问题是,建立连接后,程序会卡住它们,没有错误,也没有异常。停下来 问题答案: 这是一个死锁,您必须首先创建并刷新ObjectOutputStream。这是因为ObjectInputStream在继续操作之前先读取OOS发送的标头。
问题内容: 我正在学习Go,并且正在通过GoTours 学习此课程。到目前为止,这就是我所拥有的。 如您所见,我尝试通过打印输出到通道中的值来测试Walk函数。但是,出现以下错误。 我认为应该会出现此错误,因为我从不使用该通道。但是,有没有一种方法可以“捕获”此死锁错误并以编程方式对其进行处理? 问题答案: 死锁类似于nil指针引用,它表示程序中的一个BUG。因此,此类错误通常无法恢复。 如lbo
问题内容: 最近,我们在Java服务器应用程序中遇到了一个问题,该应用程序正在抛出未捕获的错误,因为Error是Throwable的一个单独的子类,而我们仅捕获了Exceptions。 我们通过捕获Throwables而不是Exceptions解决了眼前的问题,但这使我思考为什么您要捕获Exceptions而不是Throwables,因为您随后会错过Errors。 那么, 当您可以捕获Throwa
问题内容: 通常,如果有任何类extends ,它将成为检查异常。还扩展了Exception。那么它是如何? 难道他们在这种特殊情况下会在 编译器中 自定义检查? 编辑: 我对已 检查的v / s未检查的异常 以及它们的优缺点等有适当的了解。我不接受它们之间的区别。 问题答案: 在规范的第11.1.1节中有明确规定: 及其所有子类共同是 运行时异常类 。 在 未经检查的异常类 是运行时异常类和错误