Java并发编程
2023-12-18 16:39:15 1 举报
AI智能生成
Java并发编程是指在Java语言中,通过多线程技术实现多个任务同时执行的一种编程方式。它允许程序在执行过程中产生多个线程,从而提高程序的执行效率和响应速度。Java提供了丰富的并发编程工具,如Thread类、Runnable接口、Executor框架等,帮助开发者更好地实现并发编程。然而,并发编程也带来了一定的复杂性,如线程安全、死锁等问题,需要开发者具备一定的并发编程知识和经验。总之,Java并发编程是现代软件开发中不可或缺的一部分,对于提高程序性能具有重要意义。
作者其他创作
大纲/内容
并发理论基础
并发&并行
线程基础
线程&进程
Java线程的生命周期(6种状态)
初始(NEW)
运行(RUNNABLE)
阻塞(BLOCKED)
等待(WAITING)
超时等待(TIME_WAITING)
终止(TERMINATED)
Java线程方法
start
wait
sleep
join
notify
yield
Java线程的中断机制
Java线程间的通信
volatile
等待唤醒机制
cas +park/ unpark
synchronized + wait/notify/notifyAll
reentrantLock+Condition(await/singal/singalAll)
管道输入输出流
Thread.join
管程
synchronized
Lock+Condition
多线程模型
共享内存模型(JMM)
并发编程bug的源头
可见性问题
有序性问题
原子性问题
volatile原理
cas原理
happens-before原则
主存和工作内存交互的8大原子操作
lock(锁定)
作用于主内存的变量,把一个变量标识为一条线程独占状态
unlock(解锁)
作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
read(读取)
作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作去使用
load(载入)
作用于工作内存的变量,把read操作从主内存中得到的变量值放入工作内存的变量副本中
use(使用)
作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作
assign(赋值)
作用于工作内存的变量,把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作
store(存储)
作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write操作
write(写入)
作用于主内存的变量,把store操作从工作内存中一个变量的值传递到主内存的变量中
CPU高速缓存架构
多种缓存一致性协议
MSI protocol, the basic protocol from which the MESI protocol is derived.
Write-once (cache coherency), an early form of the MESI protocol.
MESI protocol
MOSI protocol
MOESI protocol
MESIF protocol
MERSI protocol
Dragon protocol
Firefly protocol
伪共享问题
非共享内存模型
CSP
golang
CSP 是 Communicating Sequential Process 的简称,中文可以叫做通信顺序进程,是一种并发编程模型
用于描述两个独立的并发实体通过共享的通讯 channel(管道)进行通信的并发模型。
不要通过共享内存来通信,而要通过通信来实现内存共享
Actor
Erlang
Actor模型是一个通用的并发编程模型。Actor模型的基础就是消息传递,一个Actor模型可以认为是一个基本的计算单元
它能接收消息并基于消息执行运算,也可以发送消息给其他Actor模型。各个Actor模型之间相互隔离,不共享内存。
线程安全问题
分类
运行结果错误
活跃性问题
死锁
饥饿
活锁
对象发布和初始化
线程安全问题解决方案
无锁
局部变量
不可变对象
final关键字
ThreadLocal
cas
atomic包下原子类
有锁实现
锁分类
线程要不要锁住同步资源
锁住
悲观锁
不锁住
乐观锁
等锁的过程
自旋锁
不停的去尝试获取锁
非自旋锁
阻塞型的
是否可以中断
可以
可中断锁
不可以
不可中断锁
同一个线程是否可以重复获取一把锁
可以
可重入锁
不可以
不可重入锁
多个线程竞争时,是否需要排队
需要
公平锁
不需要
非公平锁
多线程能否共享一把锁
可以共享
共享锁
不可以共享
独占锁
synchronized中锁的竞争程度
偏向锁
轻量级锁
重量级锁
synchronized
lock
基于AQS同步器 (AbstractQueueSynchronizer)
ReentrantLock
ReentrantReadWriteLock
stampedLock
并发工具类
atomic包下的原子类
AtomicInteger 、AtomicLong、AtomicBoolean
AtomicReference、AtomicStampedReference、AtomicMarkableReference
AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray
AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater
DoubleAccumulator、DoubleAdder、LongAccumulator、LongAdder、Striped64
线程池
ThreadPoolExecutor
ScheduledThreadPoolExecutor
线程协作
CountDownLatch
Semaphore
CyclicBarrier
Exchanger
Phaser
并发容器
Map
ConcurrentHashMap
ConcurrentSkipListMap
List
CopyOnWriteArrayList
Set
CopyOnWriteArraySet
ConcurrentSkipListSet
Queue
BlockingQueue
ArrayBlockingQueue
LinkedBlockingQueue
SynchronousQueue
PriorityBlockingQueue
DelayQueue
LinkedTransferQueue
ConcurrentLinkedQueue
BlockingDeque
LinkedBlockingDeque
ConcurrentLinkedDeque
Future
FutureTask
CompletionService
CompletableFuture
Fork/Join
ForkJoinPool
ForkJoinTask
高性能队列Disruptor
.........
并发设计模式
优雅终止线程的设计模式
两阶段终止模式 (Two-phase Termination)
两阶段终止(Two-phase Termination)模式是一种用于优雅终止线程的设计模式。
该模式的基本思想是通过两个阶段来终止线程,第一个阶段是发送终止请求,第二个阶段是等待线程终止。
避免共享的设计模式
不变性 模式(Immutability)
不变性模式是一种创建不可变对象的设计模式,即对象一旦创建后,就不能再进行修改。
在多线程环境下,使用不可变对象可以避免线程安全问题,并提高程序的性能和可读性。
写时复制 模式(Copy-on-Write)
在多线程环境下,Copy-on-Write模式可以提高共享数据的并发性能。
该模式的基本思想是在共享数据被修改时,先将数据复制一份,然后对副本进行修改,最后再将副本替换为原始的共享数据。
通过这种方式,可以避免多个线程同时访问同一个共享数据造成的竞争和冲突
线程本地存储 模式(Thread-Specific Storage)
线程本地存储模式用于解决多线程环境下的数据共享和数据隔离问题。
该模式的基本思想是为每个线程创建独立的存储空间,用于存储线程私有的数据。
通过这种方式,可以保证线程之间的数据隔离和互不干扰。
多线程版本的if模式
守护挂起模式 (Guarded Suspension)
Guarded Suspension 模式是一种线程等待模式,用于在多线程环境下同步共享对象的状态。
当条件不满足时,线程会进入等待状态,直到条件满足后才会被唤醒并执行相应的操作。
在 Guarded Suspension 模式中,条件检查和等待操作通常通过等待唤醒机制来实现。
避免执行模式(Balking)
Balking 模式是一种线程安全的优化模式,用于在多线程环境下避免重复执行某些操作。
当条件不满足时,线程会跳过执行相应的操作,以避免重复执行。
在 Balking 模式中,条件检查和跳过操作通常通过 synchronized 关键字和 if-then 语句来实现。
多线程分工模式
Thread-Per-Message模式
Thread-Per-Message 模式的核心思想是为每个消息分配一个独立的线程来处理,从而避免主线程阻塞和消息处理时间过长导致的性能问题。
具体来说,当消息到达时,会为其分配一个独立的线程来处理,处理完成后线程会被销毁。
工作线程模式(Worker Thread)
Worker Thread 模式是一种常见的多线程并发模式,用于解决任务处理和线程管理问题。
在该模式中,任务由主线程提交给工作线程池执行,从而避免主线程阻塞和任务过多导致的性能问题。
工作线程池管理和分配线程,从而避免线程的频繁创建和销毁。
生产者——消费者模式
生产者-消费者模式(Producer-Consumer Pattern)是一种常见的多线程并发模式,用于解决生产者和消费者之间的协作问题。
在该模式中,生产者负责生产数据或任务,并将其放入共享的队列中,而消费者则从队列中取出数据或任务并进行处理。
............
0 条评论
下一页