【多线程】实战Java高并发程序设计

第一章 Why 并行?

并行计算能应用的两个场景:图像处理、服务端编程

几个概念

同步(Synchronous)和异步(Asynchronous)

并发(Concurrency)和并行(parallelism)

临界区

阻塞(Blocking)和非阻塞(Non-blocking)

死锁、饥饿、活锁

并发级别

1.阻塞; 2.无饥饿; 3.无障碍; 4.无锁; 5.无等待


Amdahl定律和Gustafson定律:研究并行所能带来的性能的提升程度。


JMM(Java内存模型)

1.原子性;2.可见性;3.有序性;


第二章 Java并行基础

线程状态:

New、Runnable、Blocked、Waiting、Timed_Waiting、Terminated

终止线程不用stop();

线程中断

public void Thread.interrupt();  //中断线程

public boolean Thread.isInterrupted();  //判断是否中断

public static boolean Thread.interrupted();   //判断是否中断,并清楚当前中断状态

wait()和notify():

存在于Object类;

必须包含在对应的synchronzied语句中,并且都要首先获得目标对象的一个监视器。

挂起(suspend)和继续执行(resume),和stop()一样,不再使用。

等待线程结束(join)和谦让(yield)

volatile 关键字,可见性,不保证原子性;

线程组、守护线程(Daemon)、线程优先级(priority)

synchronized 关键字 :1.指定加锁对象;2.直接作用于实例方法;3.直接作用于静态方法。

第三章 JDK并发包

重入锁   java.util.concurrent.locks.ReentrantLock

lock.lock()、lock.unlock()、lock.lockInterruptibly()(中断响应)、lock.tryLock()(限时等待)、公平锁、

根据系统的调度,一个线程会倾向于再次获取已经持有的锁,这种分配方式高效,但无公平性。

Condition条件,搭配重入锁使用。

await()、singal()、awaitUninterruptibly()(在等待中不响应中断)

信号量(Semaphore)

acquire()、tryAcquire()、release()

ReadWriteLock 读写锁

倒计时器 CountDownLatch

countDown()、await()

循环栅栏 CyclicBarrier  凑齐一批,计数器归零,执行某一动作


线程池

Executor框架  newFixedThreadPool、newSingleThreadExecutor、newCachedThreadPool、newScheduledThreadPool...

计划任务  scheduleAtFixedRate、scheduleWithFixedDelay

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler hanler)

corePoolSize: 线程池中的线程数量;

maximumPoolSize: 线程池中的最大线程数量;

keepAliveTime: 当线程池中线程数量超过corePoolSize时,多余的空闲线程的存活时间。

unit: keepAliveTime的单位

workQueue:任务队列,用于保存被提交但未被执行的线程;

(直接提交队列、有界任务队列、无界的任务队列、优先任务队列)

threadFactory:线程工厂,用于创造线程,一般默认;

handler:拒绝策略;

(AbortPolicy、CallerRunsPolicy、DiscardOledestPolicy、DiscardPolicy)

扩展线程池 beforeExecute()、afterExecute()、terminated()

优化线程池线程数量

Nthreads = Ncpu * Ucpu * ( 1 + W / C )  = cpu数量*目标cpu使用率*(1+等待时间与计算时间的比率)

submit() vs execute()

并发集合 java.util.concurrent

ConcurrenHashMap、CopyOnWriteArrayList、ConcurrentLinkedQueue、BlockingQueue、ConcurrentSkipListMap(跳表)


第四章  锁的优化

有助于提高“锁”性能的几点建议:

1.减小锁持有时间;

2.减小锁粒度;(例如hashmap,分成16块,分块加锁)

3.读写分离锁来代替独占锁;(读多写少的情况下)

4.锁分离;(例如LinkedBlockingQueue,把take()和put()分离)

5.锁粗化;(主要值避免循环内反复申请锁)

Java虚拟机对锁的优化:

1.锁偏向;

2.轻量级锁;

3.自旋锁;

4.锁消除;

ThreadLocal:

ThreadLocalMap 保存了以每个线程为key的KV,类似HashMap;

在为每个线程各分配一个SimpleDateFormat、Ramdom等时能提高性能。

无锁

比较变换(CAS):一种与众不同的并发策略。

CAS(V,E,N)。V表示要更新的变量,E表示预期值,N表示新值;仅当V值等于E值时,才会将V的值设为N;否则什么都不做。最后都返回当前V值。

AtomicInteger、Unsafe类、AtomicReference、AtomicStampedReference(带时间戳的对象引用)、AtomicIntegerArray、AtomicIntegerFieldUpdater(让普通变量也享受原子操作)

无锁的Vector实现。(较难,没看懂)

SynchronousQueue的实现。

避免死锁:无锁函数、重入锁的中断或限时等待...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容