核心概念
线程(Thread):
线程是并发编程的基本单位。Java通过Thread类来创建和管理线程。每个线程都有自己的执行路径,可以并发地执行代码。
线程的状态
- NEW
- RUNNABLE:线程在操作系统中的就绪状态(等待CPU分配)和运行状态(正在使用CPU执行)。
- WAITING:无限期等待,直到被其他线程唤醒。
- TIMED_WAITING:等待指定的时间,或者直到被唤醒。
锁
同步(Synchronization):
同步是确保多个线程在访问共享资源时不会发生数据冲突的一种机制。Java提供了synchronized关键字和显式锁(如ReentrantLock)来实现同步。
并发集合(Concurrent Collections):
Java提供了一些线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等,这些集合类在并发环境下提供了更好的性能和安全性。
线程池(Thread Pool):
线程池是一种管理线程的资源池,通过复用线程来减少创建和销毁线程的开销。Java提供了Executor框架来方便地创建和管理线程池。
CAS(Compare-And-Swap):
CAS是一种无锁算法,用于在多线程环境下实现原子操作。Java中的Atomic类族就是基于CAS实现的。
可见性、原子性和有序性
volatile
Volatile是Java提供的一种弱同步机制,当一个变量被声明成volatile类型后编译器不会将该变量的操作与其他内存操作进行重排序。在某些场景下使用volatile代替锁可以减少代码量和使代码更易阅读。
特性
- 可见性:当一条线程对volatile变量进行了修改操作时,其他线程能立即知道修改的值,即当读取一个volatile变量时总是返回最近一次写入的值
- 原子性:对于单个voatile变量其具有原子性(能保证long double类型的变量具有原子性),但对于i ++ 这类复合操作其不具有原子性(见下面分析)
public class VolatileTest {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
while (true) {
if (myThread.isFlag()) {
System.out.println("flag is true");
}
}
}
}
class MyThread extends Thread {
private volatile boolean flag = false;
@Override
public void run() {
try {
Thread.sleep(1000);
flag = true;
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
public boolean isFlag() {
return flag;
}
}