一直以来的多线程的基础总结都是脱离应用的,但是要说多线程的应用就不能不说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段锁,所以多线程的竞争大大的降低。只 没有朋友的人生是孤独的,不完整的,可是,因为生活的忙碌,