网站群建设招标,常见网络营销推广方法,百度seo排名如何提升,首页重庆网站建设一、为什么引入JUC
Java 并发工具包#xff08;java.util.concurrent#xff0c;简称 JUC#xff09;的引入是为了解决多线程编程中的复杂性、性能瓶颈和安全性问题。在原生 Java 线程模型#xff08;Thread、synchronized、wait/notify#xff09;基础上#xff0c;JUC…一、为什么引入JUC
Java 并发工具包java.util.concurrent简称 JUC的引入是为了解决多线程编程中的复杂性、性能瓶颈和安全性问题。在原生 Java 线程模型Thread、synchronized、wait/notify基础上JUC 提供了更高效、更灵活的工具核心解决以下关键问题 1. 原生同步机制的局限性
synchronized 性能问题 原生 synchronized 是重量级锁在竞争激烈时会导致线程频繁挂起/唤醒引发上下文切换开销。JUC 提供了可重入锁ReentrantLock支持 非阻塞尝试获取锁tryLock()可中断锁lockInterruptibly()公平锁选项减少线程饥饿更细粒度的锁控制配合 Condition 实现多条件等待。 wait/notify 难以维护 在多条件等待场景中如生产者-消费者wait/notify 易引发错误如虚假唤醒。JUC 的 Condition 接口 支持多条件队列简化复杂同步逻辑。 2. 线程安全容器的性能瓶颈
Collections.synchronizedXXX 效率低 通过同步包装的集合如 synchronizedList使用粗粒度锁所有操作串行化。JUC 提供了高性能并发容器 ConcurrentHashMap分段锁/无锁 CAS 实现高并发读/写。CopyOnWriteArrayList读无锁写时复制适合读多写少。BlockingQueue如 ArrayBlockingQueue, LinkedBlockingQueue线程安全的阻塞队列简化生产者-消费者模型。 3. 复杂并发任务的协作困难
原生线程 API 难以协调多线程任务JUC 提供以下工具
CountDownLatch 让主线程等待多个子任务完成如启动初始化。CyclicBarrier 让一组线程相互等待直到所有线程到达屏障点如多阶段计算。Semaphore 控制同时访问资源的线程数如限流。Phaser 更灵活的分阶段屏障替代 CountDownLatch 和 CyclicBarrier。 4. 线程池管理的复杂性
原生 Thread 开销大 频繁创建/销毁线程消耗资源。JUC 提供 Executor 框架 线程池ThreadPoolExecutor, ScheduledThreadPoolExecutor复用线程资源。支持任务提交submit()、生命周期管理、拒绝策略等。避免手动管理线程。 5. 原子操作的实现成本
volatile 不够灵活 volatile 只保证可见性不保证复合操作原子性。JUC 的 atomic 包如 AtomicInteger, AtomicReference通过 CAS无锁算法 实现高效原子操作避免锁开销。 6. 避免死锁和提高可扩展性
锁分离与无锁算法 如 ConcurrentHashMap 分段锁减少竞争CopyOnWriteArrayList 读操作无锁提升高并发场景性能。非阻塞数据结构 例如 ConcurrentLinkedQueue 使用 CAS 实现无锁队列避免死锁。 代码示例对比
原生 synchronized vs ReentrantLock
// 原生 synchronized
synchronized(lock) {while (!condition) lock.wait();// 操作资源lock.notifyAll();
}// JUC ReentrantLock Condition
lock.lock();
try {while (!condition) condition.await();// 操作资源condition.signal();
} finally {lock.unlock();
}ReentrantLock 支持超时、中断且 Condition 可细分等待条件如生产者/消费者独立队列。 二、JUC 工具包核心组件
1. Lock 框架 (java.util.concurrent.locks) #mermaid-svg-q9Bpeb0LQwB39b6M {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-q9Bpeb0LQwB39b6M .error-icon{fill:#552222;}#mermaid-svg-q9Bpeb0LQwB39b6M .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-q9Bpeb0LQwB39b6M .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-q9Bpeb0LQwB39b6M .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-q9Bpeb0LQwB39b6M .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-q9Bpeb0LQwB39b6M .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-q9Bpeb0LQwB39b6M .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-q9Bpeb0LQwB39b6M .marker{fill:#333333;stroke:#333333;}#mermaid-svg-q9Bpeb0LQwB39b6M .marker.cross{stroke:#333333;}#mermaid-svg-q9Bpeb0LQwB39b6M svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-q9Bpeb0LQwB39b6M g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-q9Bpeb0LQwB39b6M g.classGroup text .title{font-weight:bolder;}#mermaid-svg-q9Bpeb0LQwB39b6M .nodeLabel,#mermaid-svg-q9Bpeb0LQwB39b6M .edgeLabel{color:#131300;}#mermaid-svg-q9Bpeb0LQwB39b6M .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-q9Bpeb0LQwB39b6M .label text{fill:#131300;}#mermaid-svg-q9Bpeb0LQwB39b6M .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-q9Bpeb0LQwB39b6M .classTitle{font-weight:bolder;}#mermaid-svg-q9Bpeb0LQwB39b6M .node rect,#mermaid-svg-q9Bpeb0LQwB39b6M .node circle,#mermaid-svg-q9Bpeb0LQwB39b6M .node ellipse,#mermaid-svg-q9Bpeb0LQwB39b6M .node polygon,#mermaid-svg-q9Bpeb0LQwB39b6M .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-q9Bpeb0LQwB39b6M .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-q9Bpeb0LQwB39b6M g.clickable{cursor:pointer;}#mermaid-svg-q9Bpeb0LQwB39b6M g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-q9Bpeb0LQwB39b6M g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-q9Bpeb0LQwB39b6M .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-q9Bpeb0LQwB39b6M .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-q9Bpeb0LQwB39b6M .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-q9Bpeb0LQwB39b6M .dashed-line{stroke-dasharray:3;}#mermaid-svg-q9Bpeb0LQwB39b6M #compositionStart,#mermaid-svg-q9Bpeb0LQwB39b6M .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-q9Bpeb0LQwB39b6M #compositionEnd,#mermaid-svg-q9Bpeb0LQwB39b6M .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-q9Bpeb0LQwB39b6M #dependencyStart,#mermaid-svg-q9Bpeb0LQwB39b6M .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-q9Bpeb0LQwB39b6M #dependencyStart,#mermaid-svg-q9Bpeb0LQwB39b6M .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-q9Bpeb0LQwB39b6M #extensionStart,#mermaid-svg-q9Bpeb0LQwB39b6M .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-q9Bpeb0LQwB39b6M #extensionEnd,#mermaid-svg-q9Bpeb0LQwB39b6M .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-q9Bpeb0LQwB39b6M #aggregationStart,#mermaid-svg-q9Bpeb0LQwB39b6M .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-q9Bpeb0LQwB39b6M #aggregationEnd,#mermaid-svg-q9Bpeb0LQwB39b6M .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-q9Bpeb0LQwB39b6M .edgeTerminals{font-size:11px;}#mermaid-svg-q9Bpeb0LQwB39b6M :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Lock ReentrantLock AbstractQueuedSynchronizer Sync NonfairSync FairSync Condition ReentrantLock Lock lock new ReentrantLock(true); // 公平锁
lock.lockInterruptibly(); // 可中断获取锁
try {// 临界区
} finally {lock.unlock();
}ReadWriteLock ReentrantReadWriteLock rwLock new ReentrantReadWriteLock();
rwLock.readLock().lock(); // 读锁共享
rwLock.writeLock().lock(); // 写锁排他Condition Condition condition lock.newCondition();
condition.await(1, TimeUnit.SECONDS); // 超时等待
condition.signal(); // 唤醒线程2. 原子类 (java.util.concurrent.atomic)
实现原理CAS (Unsafe.compareAndSwapXXX)// HotSpot 源码片段 (atomic.cpp)
jbyte Atomic::cmpxchg(jbyte exchange_value, volatile jbyte* dest...) {return __sync_val_compare_and_swap(dest, compare_value, exchange_value);
}示例AtomicInteger atomicInt new AtomicInteger();
atomicInt.updateAndGet(x - x * 2); // 原子更新// LongAdder 分段计数优化高并发
LongAdder adder new LongAdder();
adder.add(10);3. 并发容器
容器类特性实现原理ConcurrentHashMap分段锁/CASsynchronizedJDK8: Node数组链表/红黑树CopyOnWriteArrayList写时复制写操作加锁复制新数组ConcurrentLinkedQueue无锁队列CAS更新头尾节点BlockingQueue阻塞操作Condition等待队列
// ConcurrentHashMap 使用示例
ConcurrentMapString, Integer map new ConcurrentHashMap();
map.computeIfAbsent(key, k - 1); // 原子操作4. 同步工具类 CountDownLatch一次性屏障 CountDownLatch latch new CountDownLatch(3);
latch.await(); // 主线程等待
latch.countDown(); // 任务线程完成CyclicBarrier可重用栅栏 CyclicBarrier barrier new CyclicBarrier(5, () - System.out.println(All threads arrived));
barrier.await(); // 线程同步点Semaphore资源许可证 Semaphore sem new Semaphore(5); // 资源池容量
sem.acquire(); // 获取许可
sem.release(); // 释放许可Exchanger线程间数据交换 ExchangerString exchanger new Exchanger();
String data exchanger.exchange(Data); // 阻塞等待交换5. 线程池框架 #mermaid-svg-jba4MqJPccGuLRz2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jba4MqJPccGuLRz2 .error-icon{fill:#552222;}#mermaid-svg-jba4MqJPccGuLRz2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jba4MqJPccGuLRz2 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-jba4MqJPccGuLRz2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jba4MqJPccGuLRz2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jba4MqJPccGuLRz2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jba4MqJPccGuLRz2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jba4MqJPccGuLRz2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jba4MqJPccGuLRz2 .marker.cross{stroke:#333333;}#mermaid-svg-jba4MqJPccGuLRz2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jba4MqJPccGuLRz2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-jba4MqJPccGuLRz2 .cluster-label text{fill:#333;}#mermaid-svg-jba4MqJPccGuLRz2 .cluster-label span{color:#333;}#mermaid-svg-jba4MqJPccGuLRz2 .label text,#mermaid-svg-jba4MqJPccGuLRz2 span{fill:#333;color:#333;}#mermaid-svg-jba4MqJPccGuLRz2 .node rect,#mermaid-svg-jba4MqJPccGuLRz2 .node circle,#mermaid-svg-jba4MqJPccGuLRz2 .node ellipse,#mermaid-svg-jba4MqJPccGuLRz2 .node polygon,#mermaid-svg-jba4MqJPccGuLRz2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jba4MqJPccGuLRz2 .node .label{text-align:center;}#mermaid-svg-jba4MqJPccGuLRz2 .node.clickable{cursor:pointer;}#mermaid-svg-jba4MqJPccGuLRz2 .arrowheadPath{fill:#333333;}#mermaid-svg-jba4MqJPccGuLRz2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jba4MqJPccGuLRz2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jba4MqJPccGuLRz2 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-jba4MqJPccGuLRz2 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-jba4MqJPccGuLRz2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jba4MqJPccGuLRz2 .cluster text{fill:#333;}#mermaid-svg-jba4MqJPccGuLRz2 .cluster span{color:#333;}#mermaid-svg-jba4MqJPccGuLRz2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-jba4MqJPccGuLRz2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Executor ExecutorService AbstractExecutorService ThreadPoolExecutor ScheduledExecutorService 核心参数 new ThreadPoolExecutor(corePoolSize, // 核心线程数maxPoolSize, // 最大线程数keepAliveTime, // 空闲线程存活时间TimeUnit.SECONDS,new LinkedBlockingQueue(100), // 工作队列new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
)ForkJoinPool 工作窃取算法 class FibTask extends RecursiveTaskInteger {protected Integer compute() {if (n 1) return n;FibTask f1 new FibTask(n-1);f1.fork(); // 拆分子任务return f2.compute() f1.join();}
}三、深入源码解析
1. AQS (AbstractQueuedSynchronizer) 机制
// ReentrantLock 获取锁源码片段
final boolean nonfairTryAcquire(int acquires) {if (compareAndSetState(0, 1)) { // CAS尝试设置statesetExclusiveOwnerThread(current);return true;}return false;
}// 等待队列入队操作 (CLH队列)
private Node enq(Node node) {for (;;) {Node t tail;if (t null) // 初始化队列if (compareAndSetHead(new Node()))tail head;else {node.prev t;if (compareAndSetTail(t, node)) {t.next node;return t;}}}
}2. ConcurrentHashMap 扩容设计
// 扩容时数据迁移 (transfer方法)
while (nextTab ! null transferIndex 0) {synchronized (f) { // 锁住桶头节点// 将链表/树拆分成高位和低位链表if (fh 0) {NodeK,V loHead null, loTail null;NodeK,V hiHead null, hiTail null;// ...数据迁移操作...}}
}3. FutureTask 状态机
// FutureTask 状态转换
private static final int NEW 0; // 新建
private static final int COMPLETING 1; // 执行中
private static final int NORMAL 2; // 正常结束
private static final int EXCEPTIONAL 3; // 异常结束
private static final int CANCELLED 4; // 已取消
private static final int INTERRUPTING 5; // 中断中
private static final int INTERRUPTED 6; // 已中断四、高级特性与最佳实践 避免死锁的技巧 锁排序按固定顺序获取锁使用 tryLock() 带超时机制 if (lock1.tryLock(1, SECONDS)) {try {if (lock2.tryLock(1, SECONDS)) {try { /* 业务操作 */ } finally { lock2.unlock(); }}} finally { lock1.unlock(); }
}JMMJava Memory Model原则 Happens-Before 规则 程序顺序规则volatile变量规则传递性规则 性能优化 用 LongAdder 替代 AtomicLong 高并发计数避免锁升级优先用 volatile CASConcurrentHashMap.size() vs mappingCount() 五、Java 并发发展
Java 19 虚拟线程Virtual ThreadsJava 21 结构化并发Project Loom 的协程实现 学习路径建议 掌握基础锁机制 → 2. 熟练使用 JUC 工具类 → 3. 阅读源码理解原理 → 4. 通过 Arthas 等工具实战调试 → 5. 学习性能调优方案 六、总结
JUC 的核心价值
提升性能通过无锁算法CAS、细粒度锁、并发容器减少竞争。简化复杂性标准化工具如线程池、BlockingQueue替代手写复杂同步逻辑。增强安全性避免死锁、竞争条件提供更可靠的线程协作机制。可扩展性支持高并发场景如百万级连接的服务端。
理解并发工具包需要结合底层硬件知识CPU缓存、内存屏障和操作系统原理线程调度、同步原语通过工具包源码的学习能帮助开发者编写高性能、线程安全的并发程序。 文章转载自: http://www.morning.lqgtx.cn.gov.cn.lqgtx.cn http://www.morning.zmbzl.cn.gov.cn.zmbzl.cn http://www.morning.rdqzl.cn.gov.cn.rdqzl.cn http://www.morning.kdxzy.cn.gov.cn.kdxzy.cn http://www.morning.xdjsx.cn.gov.cn.xdjsx.cn http://www.morning.mqmmc.cn.gov.cn.mqmmc.cn http://www.morning.jkrrg.cn.gov.cn.jkrrg.cn http://www.morning.china-cj.com.gov.cn.china-cj.com http://www.morning.bttph.cn.gov.cn.bttph.cn http://www.morning.pdynk.cn.gov.cn.pdynk.cn http://www.morning.mbdbe.cn.gov.cn.mbdbe.cn http://www.morning.ssxlt.cn.gov.cn.ssxlt.cn http://www.morning.kqblk.cn.gov.cn.kqblk.cn http://www.morning.nffwl.cn.gov.cn.nffwl.cn http://www.morning.rxwnc.cn.gov.cn.rxwnc.cn http://www.morning.trnhy.cn.gov.cn.trnhy.cn http://www.morning.byxs.cn.gov.cn.byxs.cn http://www.morning.wxqmc.cn.gov.cn.wxqmc.cn http://www.morning.hsksm.cn.gov.cn.hsksm.cn http://www.morning.qlck.cn.gov.cn.qlck.cn http://www.morning.nxfwf.cn.gov.cn.nxfwf.cn http://www.morning.wcjgg.cn.gov.cn.wcjgg.cn http://www.morning.bhbxd.cn.gov.cn.bhbxd.cn http://www.morning.yckwt.cn.gov.cn.yckwt.cn http://www.morning.lrdzb.cn.gov.cn.lrdzb.cn http://www.morning.tzzfy.cn.gov.cn.tzzfy.cn http://www.morning.hclqy.cn.gov.cn.hclqy.cn http://www.morning.tmfhx.cn.gov.cn.tmfhx.cn http://www.morning.qgxnw.cn.gov.cn.qgxnw.cn http://www.morning.wspjn.cn.gov.cn.wspjn.cn http://www.morning.rxcqt.cn.gov.cn.rxcqt.cn http://www.morning.dlmqn.cn.gov.cn.dlmqn.cn http://www.morning.qsy40.cn.gov.cn.qsy40.cn http://www.morning.xnltz.cn.gov.cn.xnltz.cn http://www.morning.lptjt.cn.gov.cn.lptjt.cn http://www.morning.grryh.cn.gov.cn.grryh.cn http://www.morning.dnphd.cn.gov.cn.dnphd.cn http://www.morning.snkry.cn.gov.cn.snkry.cn http://www.morning.hsflq.cn.gov.cn.hsflq.cn http://www.morning.wztnh.cn.gov.cn.wztnh.cn http://www.morning.sjftk.cn.gov.cn.sjftk.cn http://www.morning.mrcpy.cn.gov.cn.mrcpy.cn http://www.morning.tgyqq.cn.gov.cn.tgyqq.cn http://www.morning.pwggd.cn.gov.cn.pwggd.cn http://www.morning.kpcky.cn.gov.cn.kpcky.cn http://www.morning.jkszt.cn.gov.cn.jkszt.cn http://www.morning.wcrcy.cn.gov.cn.wcrcy.cn http://www.morning.mbmtn.cn.gov.cn.mbmtn.cn http://www.morning.hgsylxs.com.gov.cn.hgsylxs.com http://www.morning.bpmnh.cn.gov.cn.bpmnh.cn http://www.morning.zpkfb.cn.gov.cn.zpkfb.cn http://www.morning.wzwpz.cn.gov.cn.wzwpz.cn http://www.morning.zcfmb.cn.gov.cn.zcfmb.cn http://www.morning.rrxmm.cn.gov.cn.rrxmm.cn http://www.morning.cjwkf.cn.gov.cn.cjwkf.cn http://www.morning.mzpd.cn.gov.cn.mzpd.cn http://www.morning.kdbcx.cn.gov.cn.kdbcx.cn http://www.morning.bsbcp.cn.gov.cn.bsbcp.cn http://www.morning.qbxdt.cn.gov.cn.qbxdt.cn http://www.morning.rrqbm.cn.gov.cn.rrqbm.cn http://www.morning.rjrnx.cn.gov.cn.rjrnx.cn http://www.morning.rcjwl.cn.gov.cn.rcjwl.cn http://www.morning.gkxyy.cn.gov.cn.gkxyy.cn http://www.morning.pwksz.cn.gov.cn.pwksz.cn http://www.morning.rynq.cn.gov.cn.rynq.cn http://www.morning.yhjlg.cn.gov.cn.yhjlg.cn http://www.morning.zsfooo.com.gov.cn.zsfooo.com http://www.morning.ntkpc.cn.gov.cn.ntkpc.cn http://www.morning.pyncx.cn.gov.cn.pyncx.cn http://www.morning.swlwf.cn.gov.cn.swlwf.cn http://www.morning.jtjmz.cn.gov.cn.jtjmz.cn http://www.morning.cpnsh.cn.gov.cn.cpnsh.cn http://www.morning.gxklx.cn.gov.cn.gxklx.cn http://www.morning.lmqfq.cn.gov.cn.lmqfq.cn http://www.morning.flqbg.cn.gov.cn.flqbg.cn http://www.morning.xnlj.cn.gov.cn.xnlj.cn http://www.morning.hrtwt.cn.gov.cn.hrtwt.cn http://www.morning.ngqty.cn.gov.cn.ngqty.cn http://www.morning.nyjgm.cn.gov.cn.nyjgm.cn http://www.morning.nwfpl.cn.gov.cn.nwfpl.cn