并发编程基础

1.使用线程方式

1.1 Runnable接口
1.2 Thread类(本质上实现了Runnable)
1.3 Callable/Future
1.4 ThreadPoll(推荐使用)

2.线程使用场景

2.1 文件跑批
2.2 收益/对账 文件生成
2.3 BIO模型优化
Socket socket = Socket.accept();
new Thread(new Hander(socket)).start();

3.线程的生命周期

image.png

NEW

线程初始化状态

RUNNABLE

线程可运行状态

BLOCKED

锁等待状态
a/b两个线程执行同步代码块时,
当a线程获得了锁
此时b线程访问同步代码块,此时b线程状态为:BLOCKED

WAITING

等待状态
wait/join/LockSupport.pack

TIMED_WAITING

带有超时时间的等待状态
wait/join/LockSupport.pack/sleep

TERMINATED

4.线程启动为什么是start?

通过 start0方法 调起 JVM_Start_Thread 方法来启动线程

5.线程的终止

//jdk原生方法 将OS_Thread中 isInterrupted 设为1  
//interrupt0()--->JVM_Interrupt
1.Thread.interrupt()  
2.Thread.stop() 等失效方法不推荐

6.阻塞线程是否可以终止?

阻塞线程不可以终止,会抛出 InterruptedException 异常,
抛出该异常后,OS_Thread中 isInterrupted变量将复位,变为初始值0
通知该线程处于阻塞中,无法终止
调用方需根据实际需要,自行处理

7.线程安全/数据同步

当多个线程共同修改一个对象的成员变量或一个类的静态变量,
就涉及到了所谓的"线程安全/数据同步,线程安全其实就是避免或防止多个线程间的数据脏读

个人认为处理线程安全的最好方案为避免线程同步,使用无状态对象

如果无法避免使用有状态对象或多个线程修改摸一个类的静态变量就需要使用 synchronized

8.线程锁synchronized

synchronized的特性为在作用域内 [锁共享] 与 [锁互斥]
synchronized 的使用尽量缩小使用范围,这样有利于提高效率
使用多线程就是为了并行执行任务提高效率,如果synchronized锁的范围过大或实际
执行过程中是线性执行,失去了使用多线程的意义

synchronized分为类锁和对象锁
类锁作用在类上,锁的作用域为java类 (修饰实例方法/代码块)
对象锁作用在类的某一个对象上,不同对象之间的锁相互不影响(修饰静态方法/代码块)

8 synchronized在JVM中存储

image.png

9 JVM中锁的级别

无锁->偏向锁(一般关闭)->轻量级锁->重量级锁(真正的锁)
synchronized在JDK1.6之前属于重量级锁

10synchronized的触发机制/锁升级

假设存在一个加锁方法
① 当有且只有一个线程访问改带锁方法时,使用的是【偏向锁】采用CAS原子操作
② 当多个线程前后交替访问带锁方法时,【偏向锁】升级为【轻量级锁】
轻量级锁采用"自旋"尝试,一定时间内"自旋"没有成功,升级失败将进行阻塞
(锁膨胀为重量级锁)
自旋会占用CUP资源
自旋次数 可以 通过 preBlockSpin 进行设置
也可以已使用自适应(当CUP使用率达到阈值,自动停止)
③ 当多个线程并行访问带锁方法时,此时放生阻塞,没有获得锁的线程被阻塞变为BLOCKED状态

11 重量级锁切换过程

image.png

12 wait /notify/notifyall 属于线程通信机制

wait

a .阻塞当前线程
b.当前线程释放锁资源

notify

a.唤醒当前被阻塞线程
b.占用锁资源

notifyall

唤醒当前锁所有线程,被唤醒线程再次竞争锁

wait notify 组合使用必须是同一个锁

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

推荐阅读更多精彩内容

  • Java自诞生开始就明智地选择了内置对多线程的支持,这使得Java语言相比同一时期的其他语言具有明显的优势。线程作...
    shallowinggg阅读 494评论 0 2
  • 并发基础 线程 表示一条单独的执行流,有自己自己单独的程序计数器和栈; 1.1 创建方法 继承Thread类 实现...
    _Once1阅读 315评论 0 0
  • 线程是轻量级的进程,进程可以说是线程的容器。线程是程序执行的最小单位。使用多线程而不是使用多进程进行并发程序的设计...
    Real_man阅读 760评论 1 0
  • 1. 进程和线程 提到并发,首先需要了解下进程和线程。 1.1 进程 进程,可以理解为就是一个应用程序,如当我们听...
    Kip_Salens阅读 259评论 0 2
  • 这几天我的心处于一种很平静的状态。平静下来的时候,我就总想写点什么,因为这是我长久以来的习惯。 很多年过去了,物...
    炽阳真人阅读 527评论 0 4