美文网首页
java多线程

java多线程

作者: equalchang | 来源:发表于2021-05-07 14:13 被阅读0次

一、前言

计算机组成原理

计算机操作系统

数据结构与算法

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

二、知识储备

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、发布逸出

相关文章

  • 带你搞懂Java多线程(五)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三)带你搞懂Java多线程(四) ...

  • 带你搞懂Java多线程(六)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三)带你搞懂Java多线程(四)带...

  • Java多线程目录

    Java多线程目录 Java多线程1 线程基础Java多线程2 多个线程之间共享数据Java多线程3 原子性操作类...

  • java多线程--Callable

    **移步[java多线程系列文章]Java多线程(二十二)---LockSupport工具Java 停止线程 一、...

  • android 多线程 — 线程的面试题和答案

    这里都是我从各个地方找来的资料,鸣谢: Java多线程干货系列—(一)Java多线程基础 JAVA多线程和并发基础...

  • 5月份第一周学习安排

    学习内容: java多线程及线程同步的方法(使用) java多线程各种同步方法的原理和优缺点 java多线程设计模...

  • 带你搞懂Java多线程(四)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三) 什么是线程间的协作 线程之间...

  • Java基础(六)

    多线程 Java多线程并发 1.1 JAVA 并发知识库 1.2 JAVA 线程实现/创建方式 1.2.1 继承 ...

  • (五) volatile关键字

    Java多线程目录 1 背景 理解Java多线程的内存抽象逻辑请阅读java多线程内存模型,当代操作系统,处理器为...

  • Java多线程高级特性(JDK8)

    [TOC] 一、Java多线程 1.Java多线程基础知识 Java 给多线程编程提供了内置的支持。一条线程指的是...

网友评论

      本文标题:java多线程

      本文链接:https://www.haomeiwen.com/subject/yrwsdltx.html