java多线程

一、前言

计算机组成原理

计算机操作系统

数据结构与算法

备注:相声有四门基本功:说、学、逗、唱;编程也有四门基本功:机组原理、操作系统、数据结构预算法、计算机网络

二、知识储备

1、什么是进程、什么是线程

进程: CPU分配资源的基本单位。如何判断CPU运行的进程个数?即一个多核CPU有多少个待CPU执行的任务,就有多少个进程正在运行(即有多少的程序/PID)。

线程: CPU执行的基本单位。如何判断CPU运行的线程个数?即每一个进程有多少基本单位在执行。

2、当代cpu与存储器结构及速率比较

CPU包含:ALU<1ns(算术逻辑单元)、L0<1ns(寄存器)、L1≈1ns(一级缓存)、L2≈3ns(二级缓存)、L3≈15ns(三级缓存)

存储器包含:L0<1ns(寄存器)、L1≈1ns(一级缓存)、L2≈3ns(二级缓存)、L3≈15ns(三级缓存)、L4≈80ns(内存/主存)、L5(磁盘)、L6(远程文件服存储等)


3、CPU、内存、南北桥、PCI总线的运行逻辑

北桥:靠近CPU的为北桥芯片,主要负责控制AGP显卡、内存与CPU之间的数据交换;

南桥:靠近PCI槽的为南桥芯片,主要负责鼠标、硬盘、键盘、网卡以及附加卡的数据交换。

关系:传统的南北桥架构是通过PCI总线来连接的


4、cpu是乱序执行的,并且多核cpu存在缓存同步

证明cpu是乱序执行的(CPU层级)

证明JVM存在指令重排(Hotsport层级)

证明cpu存在缓存同步,即存在MESI缓存一致性协议(OS层级)

5、数据结构、算法及理论

双向链表

队列

CLH

AQS

CAS

自旋

6、java的Unsafe操作

unpark();

park();

compareAndSwapObject();

...

三、线程的生命周期

1、java有几种创建线程方式?

a、本质上只有两种创建线程的方式

集成Thread类

实现Runnable接口

b、其他基于以上两种方式创建线程的外在表现

lambda表达式

Future接口

Callable接口

ThreadPool

2、如何正确启动线程?

正确:start()

错误:run()

3、如何正确停止线程?

正确:interrupt()

错误:stop()

4、线程生命周期的状态是如何转换的?

a、new -> runnable -> terminated

b、runnable -> blocked -> runnable

c、runnable -> waiting -> runnable

d、runnable -> time_waiting -> runnable

四、多线程安全

1、什么是线程安全

当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协同操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。——《Java Concurrency In Practice》

2、多线程三大特性

原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。

可见性:当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

有序性:程序执行的顺序按照代码的先后顺序执行。

3、synchronized

要点:加锁实现原子性

a、java代码层级:

加了synchronized关键字

b、字节码层级:

加了monitorenter, monitorexit

c、hotspot层级:


d、汇编码层级

重量级锁添加lock

4、volatile

要点:汇编 lock 实现了 volatile 的「防止指令重排」「内存可见」的特性

a、java代码层级

加了volatile关键字

b、字节码层级

属性上添加ACC_Volatile修饰

c、hotspot层级

内存屏障java规范

在每个volatile写操作的前面插入一个StoreStore屏障。

在每个volatile写操作的后面插入一个StoreLoad屏障。

在每个volatile读操作的后面插入一个LoadLoad屏障。

在每个volatile读操作的后面插入一个LoadStore屏障。

as-if-serial 原则

happens-before 原则

源码:

inline void OrderAccess::fence() {

  // always use locked addl since mfence is sometimes expensive

#ifdef AMD64

  __asm__ volatile ("lock; addl $0,0(%%rsp)" : : : "cc", "memory");

#else

  __asm__ volatile ("lock; addl $0,0(%%esp)" : : : "cc", "memory");

#endif

  compiler_barrier();

}

d、汇编码层级

lock addl $0x0,(%rsp)

e、OS层级

lock会触发缓存一致性协议,使用到该缓存行的其他cpu核的缓存失效。

5、AQS之ReentrantLock

五、实战

1、DCL单例

2、两个线程交替打印

3、多线程校验,尽快返回。即只要有一个线程false,停止其它线程。

4、死锁

5、发布逸出

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