并发是指在某个时间段内,多任务交替处理的能力。
- 1.提高资源的利用、提高任务的平均执行速度
- 2.公平(对cpu的占用)
- 3.方便(某些应用场景下,不同的线程执行不同的任务,并进行必要的协调,要比写一个程序执行所有的任务更合理)
- 1.硬件技术的发展,高并发是未来的趋势,要不要了解一下?
- 2.Java语言天生支持多线程,要不要了解一下?
- 3.Java程序员进阶必备,要不要了解一下?
-
1.使用多处理器
-
2.模型简化
-
3.对异步事件的简单处理
-
4.用户界面的更佳响应
-
1.线程安全
-
2.活跃性问题
-
死锁
-
饥饿
a. 高优先级吞噬低优先级的CPU时间片
b. 线程被永久堵塞在一个等待进入同步块的状态
c. 等待的线程永远不被唤醒
-
活锁
-
-
3.性能问题
- 1.缓存一致性问题
- 2.乱序执行优化与问题
🔗 计算机内存模型
- 1.设计的初衷
- 2.解决的问题
🔗 Java内存模型
- 1.进程、线程
进程:进程是操作系统结构的基础,是一次程序的执行;是一个程序机器数据在处理机上顺序执行时发生的活动;是程序在一个数据集合上 所运行的过程,它是系统进行资源分配和调度的独立单位。
线程:线程是CPU调度和分派的基本单位,为了更充分地利用cpu资源,一般都会是用多线程进行处理。
线程拥有自己的操作栈、程序技术器、局部变量表等资源,它与同一进程内的其他线程共享该进程的资源。
-
2.创建线程
-
4.线程间通信
b.[join]
c.[CountDownLatch]
-
5.线程池
-
1.不可变
-
2.绝对线程安全
-
3.相对线程安全
-
4.线程兼容
-
5.线程对立
- 1.互斥同步
互斥同步是常见的一种并发正确的手段。同步是指在多个线程并发访问共享数据时,保证共享数据 在同一时刻只被一个线程使用。
互斥是实现同步的一种手段,临界区、互斥量和信号量都是主要的互斥实现方式。
1). synchronize 是实现互斥的主要手段。
2). ReentrantLocak 实现同步。
- 2.非阻塞同步
基于冲突检测的乐观并发策略。就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了;如果有共享数据的争用,产生了冲突,在采取其他的补偿措施(最常见的补偿措施就是不断重试,知道成功为止),这种乐观的并发策略的许多实现都不需要把线程挂起,因此这种操作称为非阻塞同步(Non-Blocking Synchronization).
1). CAS
- 3.无同步方案
1).在不涉及到操作共享数据的情况下,这样的代码就是线程安全的。不需要在通过同步措施来保证正确性。
2).使用线程局部变量ThreadLocal
在JUC包中Lock是顶层接口。
利用synchronized实现。使用synchronized关键字将会隐式的获取锁,但是它将锁的获取与释放固化了,也就是先获取的再释放。 这种方式虽然简化了同步管理,但是可扩展性相较于显示的获取锁变差了。
利用volatile实现。定义了一个volatile int state变量作为共享资源。如果线程获取资源失败,则进入同步FIFO队列中等待。 如果获取成功,就执行临界区域代码。执行完释放资源时,会通知同步队列中的等待线程来获取资源后出队并执行。
J.U.C 中相关类
- AQS
1.初识AQS
2.AQS
- ReentrantLock
- ReentrantReadWriteLock
1. ReentrantReadWriteLock的源码学习之实现
2. ReentrantReadWriteLock的源码学习之同步容器的实现
- LockSupport
- Condition
- ConcurrentHashMap
2. ConcurrentHashMap的APi源码是实现与分析
- ConcurrentLinkedQueue;
- 阻塞队列
- AtomicInteger
- AtomicIntegerFieldUpdater
- AtomicReference
Queue相关
缓存的作用?什么是缓存?
- 面试要问?学不学。。。
- 生产过程中,遇到问题要分析解决。。。
- Java进阶必备。。。
Java虚拟机在执行Java程序的过程中会把它所管理的内存区域划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。
-
[编译器优化]