并发编程思考

并发编程的起因就是引入多线程所关注的问题,无非是为了提高cpu的利用率,尽可能的提高程序的执行效率。
并发编程需要考虑的三个点:
1.安全性问题
2.活跃性问题(活锁,死锁,线程饥饿等)
3.性能问题
并发编程的核心点:
1.分工
2.同步
3.互斥
分工就是将一个大的task分割成多个小的task,由多个线程并发的去执行,需要考虑上下文切换的开销
同步就是,既然有了多个线程并发执行,这时候就需要考虑多个线程之间通信的问题,目前Java中主流的方案就是内存共享以及通过管程来实现
互斥就是既然有了同步就会涉及到多线程的线程安全性问题,也就是会存在竟态条件,互斥目前的解决方案有很多种:
1.管程,Java原生语言支持(MESA模型)
2.Lock锁,需要手动加锁以及释放锁资源
3.CopyOnWrite模式,可能会存在内存的浪费
4.Immutable模式,不可变则一定线程安全,正在的Immutable的类实现的时候要保证类的属性也是不可变的
5.CAS模式,线程竞争激烈时可能会存在浪费cpu资源的情况,以及ABA问题
6.ThreadLocal模式,可能会存在内存泄露的隐患,这个内存泄露指的是在线程池中使用threadlocal,由于线程池中每个线程的生命周期比较长,导致threadlocal的内存可能无法回收,这个无法回收是指每个threadlocal对应于entry中的一个key,虽然是weakReference,可以回收,但是value却是强引用,不能自动回收,从而可能会导致内存泄露。解决方案就是最好在threadlocal使用完之后手动remove掉
7.Actor模式,本质也是通过不共享内存实现,异步,消息机制,可能不能保证消息百分百送达,Java不支持需要依赖第三方类库,如AKKA
8.STM(software transaction memory) ,参照数据库的MVVC实现,Java不支持,需要依赖第三方类库
9.go的csp模式(主要利用的是轻量级协程)

主要的线程安全工具类:
1.CountDownLatch
2.CyclicBarrier
3.ReentrantLock
4.CopyOnWrite系列
5.unmodify系列
6.Immutable系列
7.StampedLock
8.Disruptor无锁高性能线程安全队列
9.阻塞队列如BlockingArrayQueue和SynchronousQueue以及优先级队列和延时队列等
10.Guava中的Future系列
11.CompleteService
12.CompletableFuture
13.Atomic系列
14.concurrent系列

常见的线程池类型:
1.SingleThreadPool
2.FixedThreadPool
3.CachedThreadPool
4.ScheduleThreadPool
5.ForkJoinPool

并发编程优秀案例:
1.netty网络编程非阻塞io模型(reactor模式)
2.ratelimitter 高性能限流器
3.disruptor高性能线程安全队列
4.Hakira高性能数据库连接池
5.协程
6.STM
7.Actor模型

线程池的大小设置规则:
如果是cpu密集型则 threadCounts = cpu核数 + 1
如果是io密集型则 threadCounts = cpu核数 * (cpu执行时间/IO操作耗时 + 1)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值