JUC并发编程

📅 发布时间:2026/7/3 22:36:47 👁️ 浏览次数:
JUC并发编程
1. synchronizedsynchronized是 Java 提供的内置锁可以修饰方法或代码块用来保证同一时刻只有一个线程进入临界区。它既能保证原子性也能保证可见性和有序性。线程进入同步块时会加锁退出时释放锁并把工作内存中的共享变量刷新回主内存。在 JDK1.6 之后synchronized 做了很多优化比如偏向锁、轻量级锁、自旋锁等。2. volatilevolatile主要保证变量的可见性和有序性。一个线程修改了volatile变量后其他线程能立刻看到最新值。同时它会禁止部分指令重排。但它不能保证复合操作的原子性比如count仍然不是线程安全的因为它包含读、改、写三个步骤。使用场景状态标记位双重检查单例中的实例变量3. synchronized 和 volatile 的区别synchronized能保证原子性、可见性和有序性volatile只能保证可见性和有序性不能保证原子性。如果只是一个简单状态标记可以用volatile如果涉及多个操作组成的临界区通常要用synchronized或锁。4. 线程创建方式Java 中创建线程常见有三种方式继承Thread类实现Runnable接口实现Callable接口配合FutureTask获取返回值。实际开发中更推荐使用线程池而不是频繁手动创建线程因为线程创建和销毁开销较大线程池可以复用线程、控制并发数量、统一管理任务。5. CASCAS 是 Compare And Swap也就是比较并交换是一种无锁并发思想。它的核心逻辑是先比较当前内存值是否等于预期值如果相等就更新否则说明有其他线程修改过当前线程重试。Java 中很多原子类比如AtomicInteger底层就是基于 CAS 实现的。优点性能高避免线程阻塞缺点可能出现 ABA 问题自旋重试也会消耗 CPU。6. AQSAQS 全称是 AbstractQueuedSynchronizer是 Java 并发包中一个非常核心的同步器框架。它维护一个state状态值和一个FIFO 等待队列很多锁和同步工具都基于它实现比如ReentrantLockCountDownLatchSemaphoreReentrantReadWriteLock它的核心思想是线程获取同步状态失败后进入队列等待释放时再唤醒后续节点。一句话总结AQS 是很多并发工具类的底层基础。7. ReentrantLockReentrantLock是可重入锁功能上和synchronized类似但更灵活。它支持可中断锁尝试获取锁tryLock()公平锁和非公平锁多个条件变量Condition。相比synchronized它可控性更强适合复杂并发场景。但使用时要手动释放锁通常放在finally中否则可能导致死锁。8. ThreadPoolExecutorThreadPoolExecutor是 Java 中最核心的线程池实现。它的执行流程大致是任务来了先看当前线程数是否小于核心线程数corePoolSize小于就创建核心线程执行任务如果达到核心线程数就尝试把任务放入阻塞队列队列满了再看线程数是否小于最大线程数maximumPoolSize如果小于就创建非核心线程处理如果也达到最大线程数就执行拒绝策略。线程池的好处是复用线程减少创建销毁开销控制并发数量提高响应速度统一管理任务。实际开发中我会手动创建ThreadPoolExecutor指定核心线程数、最大线程数、队列大小和拒绝策略而不是直接用Executors默认工厂。