,震惊全国。江苏徐州奉贤县铁链女(生八个孩子的女人)的消息渐渐沉寂(https://ufqi.com/news/ulongpa...仍然是一个生了孩子的女人徐州奉贤县八个孩子独自面对命运|舆论手册),暂且不谈。近期部署GWA2Java运行于某金融项目(幸运金融:https://ufqi.com/finance)后,在并发、数据同步、多进程多线程数据访问控制等方面不断遇到挑战。在之前的博客中,我们详细讨论了数据同步时数据加锁的过程:SynchronizedSynchronizedQuqueQueueConcurrency并发和ThreadLockLock(https://ufqi.com/blog/gwa2-ph...)。今天继续这个话题,讨论在ApacheTomcat托管GWA2Java的多进程、多线程编程和运行环境下,如何实现多线程间数据的隔离和共享。前文提到,在ApacheTomcat等容器中,实现数据安全控制的最佳方式是使用Synchronized同步机制,让程序运行在单线程中,但很难在Application层面扩展处理能力。所以我们修改了规则,synchronized同步机制默认不再全局启用。这样一来,GWA2Java又回到了多进程多线程的运行环境,并发扩展能力激增。接下来就是多线程运行环境下数据的隔离和共享。有些数据需要隔离。比如在多线程并发运行环境中,当请求1被线程A接管时,请求2被线程B接管,如果不做数据隔离,整个流程中的数据就会重复。为传入请求设置为后者。我们需要一些机制来限制向线程请求的各种数据。同时,一些数据需要共享。一个接口或进程启动后,总会有一些全局设置或变量需要在所有线程中访问。这就需要我们提供某种机制,能够满足在多线程环境下对一些全局数据的读写访问,并保证这些数据是线程安全的(Thread-Safe)。图。1。单线程和多线程运行状态示意图经过一番分析和探索,我们对GWA2Java做了如下改进和升级,实现了GWA2Java从“线程不安全-单线程安全-多线程安全”的演进.1/3。改进全局数据容器数据类型:将HashMap替换为ConcurrentHashMap。脱胎于GWA2PHP,我们始终认为需要一个全局的数据容器来临时存储任务/业务处理过程中产生的数据。这个数据容器无疑是字典表什么的类型。在GWA2Java中,一开始使用的是HashMap(非线程安全),但是在遇到数据同步问题后,使用Synchronized同步关键字临时解决。经过进一步的探索和研究,我们认为是时候使用ConcurrentHashMap而不是HashMap了。ConcurrentHashMap对多线程有更好的支持,是一种原生的Java数据类型。还有一个价格。毕竟ConcurrentHashMap在读写数据的时候要处理线程锁的问题,因为数据处理开销较高,速度稍慢。另一个不能接受的是ConcurrentHashMap不接受null值,key和value都不接受。这对于讨厌Javanull的开发者来说无疑是会更加关注的。在存储data数据时,需要考虑到是否为null的预判断。....原文全文:https://ufqi.com/blog/gwa2-ja...,-R/22SU
