多线程如何实现不加锁实现高并发
最主要的想法是运用多线程实现高并发的处理数据,用来提升对数据的处理速度,起初运用的是线程池和普通数据库连接但是并发操作会造成死锁的问题出现,原因是两个线程同时抢到了同一个资源造成的,解决方式是给要执行的对象上一个锁,但是这样就相当于哪个线程先抢到了就会将业务锁上其他都在等待,实际上就还是相当于单线程在执行业务。后来运用到了数据库连接池这样就解决了多个线程同时抢到资源后可以同时处理。以下是两种方式测试的结果。测试的方式是逐条删除表中第一条数据看线程处理时间。
下表是运用线程池和使用普通数据连接,进行的单线程和多线程测试结果。 测试时间 线程数 删除条数 执行处理总时长
以上可以看出,多线程与单线程在处理删除1000数据的时候有时单线程快,有时多线程快,在删除100条数据的时候也是没差多少,分析应该是多线程实际上执行逐条删除业务的时候,还是单线程在跑。因为它是普通数据库连接,对数据库操作只能是逐条操作的。所以必须对删除方法加上一个lock锁,如果不加就会报死锁。所以这样的多线程是无意义的。
接下来我们运用了线程池及数据库连接池,进行单线程和多线程的执行速度测试。
以上可以看出多线程处理数据的优势明显的显示出来了,有几次慢的原因是数据库不是本地,数据库存在网络异常波动,导致数据库连接本身就很慢。但是大量的实验证明多线程处理速度比单线程快。这里有一点要说明,多线程存在同时抢到统一资源的情况是不可避免的,这样比如说两个线程都抢到同一ID,并对这个ID下的值进行删除,肯定会存在一个线程空删除数据的操作,这样数据量就不对了。但是又不想加锁那就得对要处理的业务进行判断.
