第一,同步锁,一般使用场景就是阻塞,唤醒操作,在开发RPC框架、分布式锁时,需要使用,其他场景并无任何意义。因为分布式环境下,保障数据一致性,可以依赖数据库mysql、缓存数据库redis、或者某中心服务器、分布式锁等。
第二、回答你的问题,我认为就得使用队列,生产者消费者,排队做事情,先进先出。
第三、什么业务需求需要多线程池。
java任何业务需求,都需要多线程池,除非你使用AIO+多进程,但是这并不能体现java虚拟机的强大,java虚拟机天生可以使用多核。
tomcat天生就tomcat线程
mysql、redis、mongodb等等任何都有他的线程,只不过他隐藏了(隐藏方式)
/**
* 获取数据
*
* @param ioSession
* 链接句柄
* @param tcpPacket
* 消息包
* @return
*/
public static TcpPacket lock(IoSession ioSession, TcpPacket tcpPacket) {
// 获取锁
WaitLock waitLock = getWaitLock();
// 设置此进程唯一id
tcpPacket.lockedId = waitLock.getInstanceId();
// 同步块
synchronized (waitLock) {
// 发送消息
ioSession.write(tcpPacket);
try {
// 等待解锁
waitLock.wait(waitLockTime);
} catch (InterruptedException e) {
if (MinaConfig.log != null) {
MinaConfig.log.error("获取数据超时", e);
}
}
}
// 解锁成功返回数据
return waitLock.getTcpPacket();
}
/**
* 唤醒同步块
*
* @param tcpPacket
* 返回的消息包
*/
public static void unLock(TcpPacket tcpPacket) {
// 如果没有此进程唯一的唤醒id则返回
if (tcpPacket.unlockedId == 0) {
return;
}
// 根据唤醒id获取锁对象
WaitLock waitLock = waitLockMap.get(tcpPacket.unlockedId);
// 携带消息包
waitLock.setTcpPacket(tcpPacket);
// 唤醒
synchronized (waitLock) {
waitLock.notify();
}
// 移除数组
waitLockMap.remove(tcpPacket.unlockedId);
}
tcp的更别说了,mina,netty专做网络层,消息推送、缓冲区、轮训检查基本都得用到多线程。
如果你想学多线程,可以看我写的RPC框架,做游戏、做网站、做通讯等都可以,有一套非常通用的多线程模型,grain-threadmsg。dianbaer/grain
下面是我原来做的mmorpg,虽然不维护了,有很高的参考价值,跟天龙八部的多线程架构一样,达到交互很高的水平