《java并发编程的艺术》note

骑猪看日落 2022-06-01 12:49 291阅读 0赞

关于内存模型,并发包的底层实现仍需研究。

6.java并发容器和框架

6.1ConcurrentHashMap
6.2ConcurrentLinkedQueue 同步队列
6.3java中的阻塞队列 插满等,移空空
6.4Fork/Join框架 切分小任务

7.java中13个原子操作类

  1. 原子更新基本类型类:
  2. AtomicBoolean
  3. AtomicInteger
  4. AtomicLong
  5. 原子更新数组
  6. AtomicIntegerArray
  7. AtomicLongArray
  8. AtomicReferenceArray
  9. AtomicIntegerArray
  10. 原子更新引用类型
  11. AtomicReference
  12. AtomicReferenceFieldUpdater
  13. AtomicMarkableReference
  14. 原子更新字段类
  15. AtomicIntegerFieldUpdater
  16. AtomicLongFieldUpdater
  17. AtomicStampedReference

8.JAVA的并发工具类

8.1 CountDownLatch
希望主线程等待多个线程都执行完,主线程才继续执行。
await()会阻塞当前线程,直到N减到0。如不希望主线程一直等待,用await(long time,TimeUnit unit)。
多线程时,只需把CountDownLatch的引用传递到线程里。
8.2CyclicBarrier
同步屏障,每个线程调用await()告诉Cyclic已到达屏障,挡够数目,开闸
可以new CyclicBarrier()的同时 指定开闸后优先执行的线程(此线程不必是被挡的。如多个sheet计算线程,都来齐时优先执行汇总线程
8.3CyclicBarrier和 CountDownLatch区别
CyclicBarrier比较强大,适用于复杂业务,比如计算出错可以重设计数器。查看被挡线程数目,挡住的线程是否中断
8.4Semaphore
Semaphore用来控制同时并发访问资源的线程数量(限流)
8.5Exchanger
用于线程间交换数据
比如A/B分别计算,可以校对

9.java中的线程池

9.1核心池–队列–线程池–饱和策略
9.2
new ThreadPoolExecutor(corepoolsize,maximumpoolsize,keepAliveTime,milliseconds,runnableTaskQueue,handler)
9.3 threadPool.execute()提交不需返回值的任务
9.4关闭线程池
.shutdown() .shutdownNow()
只要调用其一,则isShutdown()为true,但所有任务结束,isTeminated()才是true
不一定任务要执行完可用shutdownNow()
建议不要用无界队列

10.Executor框架

Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好.
10.1Executor简介
结构:任务,任务执行,异步计算结果
成员:
1.ThreadPoolExecutor
2.ScheduledThreadPoolExecutor
3.Future接口
4.Runnable接口和Callable接口
10.2ThreadPoolExecutor详解

  1. FixedThreadPool
  2. SingleThreadExecutor
  3. CachedThreadPool

10.3 ScheduledThreadPoolExecutor
主要用来给定时间和延迟时间的任务,定期任务等
1.4Future的实现类FutureTask

高并发抢红包项目:总红包表,记录用户红包表
bug版:前端传入用户id与红包id,请求controller,查询剩余红包>0则总红包表-1,插入用户红包表记录。因为查询没锁,所以出现红包数减到负的情况。
悲观锁版:查询语句加for update则查询加上悲观锁,只能等一个线程搞完提交事务下一线程才能拿到锁继续,性能问题
乐观锁版:先取版本号,update总红包表剩余红包时加上版本号(cas),版本一致才成功。否则重入,重入可用代码控制,三次,不断轮询etc。

发表评论

表情:
评论列表 (有 0 条评论,291人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java并发编程艺术

         什么是上下文切换: 上下文切换 即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现 这个机制。时间片是CPU分配给各个线程的时间