怎样解决死锁的问题

来源:3-4 使用jstack生成线程快照

Hoon

2015-08-22 15:27

老师有没有讲解死锁的教程啊,请教学

写回答 关注

2回答

  • 慕斯卡6635957
    2020-01-16 09:21:40

      final NioSocketConnector connector = getConnector();

            connector.getFilterChain().addLast("transportCoder",

                    new ProtocolCodecFilter(new CustomProtocolCodecFactory(Charset.forName("UTF-8"))));

            connector.getSessionConfig().setReceiveBufferSize(2048);//接收缓冲区1M

            connector.setConnectTimeoutMillis(ConfigBean.getHeartbeatTimeout()); // 设置连接超时

            connector.setHandler(new TcpClientHandler());// 设置消息处理器

            connector.getFilterChain().addLast("exceutor", new ExecutorFilter());

            //=============添加监控,断线重连============

            connector.setDefaultRemoteAddress(new InetSocketAddress(ConfigBean.getOpenRestyUrl(),ConfigBean.getOpenRestyPort()));

            connector.addListener(new IoListener(){

                @Override

                public void sessionDestroyed(IoSession arg)throws Exception{

                    cfs=null;

                    for (;;) {

                    if (isHostConnectable(ConfigBean.getOpenRestyUrl(), ConfigBean.getOpenRestyPort())) {

                      try {

                                   Thread.sleep(5000);

                                   ConnectFuture future = connector.connect();

                                   future.awaitUninterruptibly();// 等待连接创建完成 这里可能出现死锁

                                   session = future.getSession();

                                   if (session.isConnected()) {

                                       cfs=future;

                                       logger.info("断线重连[" + connector.getDefaultRemoteAddress().getHostName() + ":" + connector.getDefaultRemoteAddress().getPort() + "]成功");

                                       break;

                                   }

                               } catch (Exception e) {

                                   cfs=null;

                                   logger.error("重连服务器登录失败,5秒再连接一次:" + e.getMessage());

                               }

                    }

                    }

                }

            });


  • jasonvon1992
    2015-12-24 11:50:19

    之前看书有讲:1、尽量避免不必要的synchronized关键字。2、可以用其他方法替换synchronized关键字,比如标志不可变量。3、保证synchronized代码块简练。个人表述不太清楚,详见《Java Network Programming》第四版Deadlock块部分,谢谢。

细说多线程之Thread VS Runnable

认识Thread和Runnable的区别,以及使用jstack生成线程快照

55327 学习 · 68 问题

查看课程

相似问题