Geek漫游指南

Java多线程实战

date
slug
java-multi-threading-practice
author
status
Public
tags
技术分享
summary
type
Post
thumbnail
category
💻 Backend
updatedAt
Oct 29, 2023 10:08 AM

并发和并行

notion image
从硬件的角度来说,在一个处理器一次只能够运行一个线程的情况下,由于处理器使用时间片分配的技术实现在同一时间内运行多个线程(交替运行),因此一个线程就可以实现并发。而并行则需要考多个处理器在同一时刻上各自运行一个线程来实现。
 
Runtime.getRuntime().availableProcessors() - 返回Java虚拟机可计算资源数
notion image
这个值可能会在虚拟机特定调用期间更改。
 
虚拟机 - Linux实现获取值
notion image
 
 
 

原子性

sequence++ 非原子操作
  1. load
  1. increment
  1. store
别的线程不会看见某个线程操作的"中间状态”
 

可见性

  1. JIT编译器为了优化读取变量的性能,会避免重复读取状态变量
  1. 如果两个变量被分配到不同处理器核心的寄存器上,可见性问题就会产生
  1. 即使因为某个共享变量被分配到了主内存中,也不能保证可见性,因为这之间还有一个高速缓存,一个处理器上运行的线程对变量的更新可能只是更新到该处理器的写缓存器(Store Buffer)里。
 

重排序

  1. 指令重排序
  1. 内存子系统重排序