如何实现高效的并发编程

1.无锁并发编程

   锁竞争会引起上下文切换,所以避免使用锁是一种办法:例如将数据进行hash,进行分段,不同线程处理不同的段上的数据。


2.CAS算法

   java的Atomic包使用CAS算法来更新数据,而不需要加锁


3.使用最少线程

   避免创建不需要的线程,例如任务很少,却创建了大量线程,造成大量线程处于等待状态


4.协程

  在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换



5.实战例子:观察进程中的线程

  使用jstack命名dump线程信息

  jstack pid > dump17


  统计所有线程的状态

  grep java.lang.Thread.State dump17 | awk '{print $2$3$4$5}' | sort | uniq -c



6.如何避免死锁

  避免同一个线程同时获取多个锁

  避免一个线程在锁内占用多个资源,尽量保证每个锁只占用一个资源

  尝试使用定时锁,使用lock,tryLock(timeOut) 来代替使用内部锁机制

  对于数据库锁,加锁和解锁必须在同一个数据库连接里,否则会出现解锁失败的情况



7.CAS算法(Compare And Swap)

   实现轻量级的原子操作,可以使用CAS算法,java的并发框架中提供了一些Atomic工具类可以帮助完成

   但CAS算法存在三个问题:ABA问题,循环时间长开销大,只能保证一个共享变量的原子操作



  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值