关于多线程并发的一点见解

多线程并发处理的前提是保证数据安全。众所周知多线程环境下对共享数据的访问会引发线程安全问题,所以应该在保证线程安全的情况下尽量提升并发性能。保证线程安全的手段主要是加锁,锁主要分为悲观锁和乐观锁(无锁机制)。

悲观锁

常见的悲观锁机制就是让线程顺序执行即没有并发。并发分为三种情况:读读,读写,写写。
(一)第一种读读情况下是完全没有必要进行加锁的,因为没有对数据进行任何修改,不存在线程安全问题。java中常见的ReentrantReadWriteLock的出现就是为了解决多线程读读阻塞的问题。
(二)第二种读写情况如果对数据实时性要求不是很严格,可以考虑CopyOnWrite写时复制技术,他的思想是每次写就会对原来数据copy一份副本,对副本进行修改,修改完毕赋值回去,读的时候还是读取原来的数据。所以这种方式可以解决读写阻塞的问题,让读写可以并行处理,但是数据可能实时性不能严格保证,另外他不适合写比较多的情况因为每次写数据都会copy一份副本,内存会产生大量垃圾对象对垃圾回收产生负担。
(三)第三种写写情况是要严格加锁的,如果对同一个数据并发修改会产生一些数据被覆盖的情况。但是也有一些思想可以优化比如将数据变化存到不同的空间区域,然后对这些区域进行合并处理。例如java提供的LongAdder。
除去上面三种情况还可以减小锁的粒度和范围提高并发性。

乐观锁

乐观锁是一种无锁机制,通过对数据修改前后比较判断数据是否被其他线程修改过,如果判断不一致则本次修改无效因为被其他线程修改了。
数据库版本号也是一样的思想,每次修改都对版本号加1,where条件后面加上版本号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值