Java多线程基础总结九:Mina窥探(1)

一直以来的多线程的基础总结都是脱离应用的,但是要说多线程的应用就不能不说Mina。Apache Mina作为一个高性能的Java异步并发网 络通讯框架,其内部的多线程的设计和实现可谓是学习多线程的良药。手上的Mina源码是svn剪下来的最新的代码,mvn转化成eclipse项目 后导入mina-core的源码看看多线程的应用吧。

首先简单的介绍在org.apache.mina.core.service包里的核心接口之一:IoService。这个接口是对于服务器端接收连接和客户端发起连 接这两种服务的顶层抽象,所以就有了IoAccepTor和IoConnecTor两个子接口的继承与隔离。很拍马屁的说,从这个小细节可以看到mina架 构的精细。这种程度的接口的隔离最重要的就是对接口内抽象行为的准确划分,错误的划分接口的职责将使得后面得实现显得不合理甚至是 错误。只是不知道负责抽象的设计人员是否是一次性的抽象成功,如果是只能说牛x。至于交互会话IoSession和实际的I/O操作处理器 IoProcessor 以及底层处理I/O事件的IoHandle这些接口就不废话了,今天看的是与IoServiceListener有关的多线程应用。 IoServiceListener主要是用来监听IoService相关的事件,而今日主角–IoServiceListenerSupport则是用来把IoService和对应的 IoServiceListener包装在一起进行管理的辅助类。先看看其源码:

Java代码

public class IoServiceListenerSupport {   /** The {@link IoService} that this instance manages. */   private final IoService service;   /** A list of {@link IoServiceListener}s. */   private final List listeners = new CopyOnWriteArrayList ();   /** Tracks managed sessions. */   private final ConcurrentMap managedSessions = new ConcurrentHashMap();   /** Read only version of {@link #managedSessions}. */   private final Map readOnlyManagedSessions = Collections.unmodifiableMap (managedSessions);   private final AtomicBoolean activated = new AtomicBoolean();   /** Time this listenerSupport has been activated */   private volatile long activationTime;   /** A counter used to sTore the maximum sessions we managed since the listenerSupport has been  activated */   private volatile int largestManagedSessionCount = 0;   /** A global counter to count the number of sessions managed since the start */   private volatile long cumulativeManagedSessionCount = 0;   /**    * Adds a new listener.    *    * @param listener The added listener    */   public void add(IoServiceListener listener) {     if (listener != null) {       listeners.add(listener);     }   }   /**    * @return true if the instance is active    */   public boolean isActive() {     return activated.get();   }   /**    * Calls {@link IoServiceListener#serviceActivated(IoService)}    * for all registered listeners.    */   public void fireServiceActivated() {     if (!activated.compareAndSet(false, true)) {       // The instance is already active       return;     }     activationTime = System.currentTimeMillis();     // Activate all the listeners now     for (IoServiceListener listener : listeners) {       try {         listener.serviceActivated(service);       } catch (Throwable e) {         ExceptionMoniTor.getInstance().exceptionCaught(e);       }     }   }   /**    * Calls {@link IoServiceListener#sessionCreated(IoSession)} for all registered listeners.    *    * @param session The session which has been created    */   public void fireSessionCreated(IoSession session) {     boolean firstSession = false;     if (session.getService() instanceof IoConnecTor) {       synchronized (managedSessions) {         firstSession = managedSessions.isEmpty();       }     }   ...     cumulativeManagedSessionCount ++;   ...   }}

这里为了说明多线程的应用,我仅仅节选相关的方法和方法片段。从这个类中我们还是能看到丰富的多线程的应用的。下面就开始这盘 菜吧!

首先从全局变量开始看看:CopyOnWriteArrayList,ConcurrentMap,AtomicBoolean,volatile堪称多线程小动员了。后两者之前都有 介绍暂时省略,后面的方法分析时会看到使用情景。前两者都是java.util.concurrent包下的并发集合框架成员。ConcurrentMap是高效的 并发Map实现,主要是采取分段加锁的机制,默认是16段锁,所以多线程的竞争大大的降低。只 没有朋友的人生是孤独的,不完整的,可是,因为生活的忙碌,

Java多线程基础总结九:Mina窥探(1)

相关文章:

你感兴趣的文章:

标签云: