当前位置: 首页 > news >正文

几大网站类型新手做电商怎么起步

几大网站类型,新手做电商怎么起步,做网站的标签及属性,广州代理记账在Java多线程编程中,锁机制是保障线程安全的核心手段。虽然synchronized关键字能满足大部分场景需求,但在复杂并发场景下,ReentrantLock提供了更灵活、强大的锁控制能力。同时,合理控制锁的粒度也是提升程序性能的关键。本文将深入…

在Java多线程编程中,锁机制是保障线程安全的核心手段。虽然synchronized关键字能满足大部分场景需求,但在复杂并发场景下,ReentrantLock提供了更灵活、强大的锁控制能力。同时,合理控制锁的粒度也是提升程序性能的关键。本文将深入探讨ReentrantLock的特性与使用方法,并介绍如何实现更小级别的锁控制。

一、ReentrantLock:超越synchronized的高级锁

1.1 可重入性:线程的“重复通行证”

ReentrantLocksynchronized一样支持可重入性,即同一线程可以多次获取同一把锁,每次获取锁时计数器加1,释放锁时计数器减1,当计数器为0时才真正释放锁。这避免了线程因多次获取同一锁而导致的死锁问题。

ReentrantLock lock = new ReentrantLock();
public void outerMethod() {lock.lock();try {innerMethod();} finally {lock.unlock();}
}public void innerMethod() {lock.lock();try {// 内部方法逻辑} finally {lock.unlock();}
}

1.2 公平锁与非公平锁:调度策略的选择

ReentrantLock支持两种锁模式:

  • 非公平锁(默认):新线程在尝试获取锁时,即使有线程在等待队列中,也可能直接获取锁,具有更高的吞吐量。
  • 公平锁:线程严格按照申请锁的顺序依次获取,避免线程饥饿,但会降低一定的性能。
// 创建公平锁
ReentrantLock fairLock = new ReentrantLock(true);
// 创建非公平锁
ReentrantLock unfairLock = new ReentrantLock();

1.3 可中断锁:线程的“紧急刹车”

ReentrantLock允许线程在等待锁的过程中被中断,通过lockInterruptibly()方法实现:

ReentrantLock lock = new ReentrantLock();
try {lock.lockInterruptibly();// 业务逻辑
} catch (InterruptedException e) {// 处理中断Thread.currentThread().interrupt();
} finally {lock.unlock();
}

当线程在等待锁时被中断,会抛出InterruptedException异常,从而可以及时处理中断逻辑,避免线程无限期等待。

1.4 超时锁:避免无限等待

tryLock()方法提供了限时获取锁的能力,可以指定等待时间,避免线程因无法获取锁而一直阻塞:

ReentrantLock lock = new ReentrantLock();
if (lock.tryLock(5, TimeUnit.SECONDS)) {try {// 获取锁后执行的逻辑} catch (InterruptedException e) {// 等待过程中被中断} finally {lock.unlock();}
} else {// 超时未获取到锁的处理
}

1.5 条件变量:更灵活的线程通信

ReentrantLock通过Condition接口提供了比synchronized更强大的线程协作能力。每个Condition都对应一个独立的等待队列,可以实现更精细的线程唤醒控制。

1.5.1 Condition核心方法
方法签名作用描述
await()当前线程释放锁并进入等待状态,直到被其他线程唤醒或中断
await(long timeout, TimeUnit unit)当前线程等待指定时间,超时后自动唤醒
signal()随机唤醒一个在该Condition上等待的线程
signalAll()唤醒所有在该Condition上等待的线程
1.5.2 Condition使用模式
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();// 等待条件的线程
public void waitOnCondition() throws InterruptedException {lock.lock();try {while (!conditionMet()) {  // 必须用while防止虚假唤醒condition.await();     // 释放锁并进入等待状态}// 条件满足后的业务逻辑} finally {lock.unlock();}
}// 通知条件的线程
public void signalCondition() {lock.lock();try {// 修改条件updateCondition();condition.signal();  // 唤醒一个等待线程} finally {lock.unlock();}
}
1.5.3 Condition vs synchronized的wait/notify
特性synchronized+wait/notifyReentrantLock+Condition
等待队列数量每个对象只有一个等待队列可创建多个独立的Condition,每个对应一个等待队列
唤醒精确性只能随机唤醒一个线程或唤醒所有线程可精确选择唤醒特定Condition队列中的线程
中断支持等待过程中不可中断支持中断(awaitInterruptibly()
超时机制仅支持带超时的wait(long timeout)支持更灵活的超时设置(await(time, unit)
条件检查原子性需手动保证在同步块中检查条件锁与条件操作集成,更安全
1.5.4 典型应用场景:有界队列
class BoundedQueue<T> {private final Queue<T> queue = new LinkedList<>();private final int capacity;private final ReentrantLock lock = new ReentrantLock();private final Condition notFull = lock.newCondition();  // 队列未满条件private final Condition notEmpty = lock.newCondition(); // 队列非空条件public BoundedQueue(int capacity) {this.capacity = capacity;}// 入队操作public void enqueue(T item) throws InterruptedException {lock.lock();try {while (queue.size() == capacity) {notFull.await();  // 队列已满,等待非满条件}queue.add(item);notEmpty.signal();  // 入队后,通知队列非空} finally {lock.unlock();}}// 出队操作public T dequeue() throws InterruptedException {lock.lock();try {while (queue.isEmpty()) {notEmpty.await();  // 队列已空,等待非空条件}T item = queue.poll();notFull.signal();  // 出队后,通知队列未满} finally {lock.unlock();}}
}

场景 1:正常入队(队列未满)
正常入队
场景 2:队列已满时生产者阻塞
队列已满时生产者阻塞
场景 3:正常出队(队列非空)

正常出队
场景 4:消费者唤醒生产者
消费者唤醒生产者

1.6 Condition实现原理

Condition的实现依赖于AQS(AbstractQueuedSynchronizer),每个Condition对象都维护一个独立的等待队列:

  1. 当线程调用await()时:
    • 当前线程会被封装成Node加入Condition队列
    • 释放锁(即修改AQS状态)
    • 线程进入等待状态
  2. 当线程调用signal()时:
    • 从Condition队列头部取出一个Node
    • 将其转移到AQS的同步队列中
    • 被转移的线程有机会在锁释放时竞争锁

这种双队列设计使得Condition能够提供比synchronized更灵活的线程协作能力。

二、细化锁的粒度:从类级别到更小范围

2.1 类级别锁的局限性

类级别锁会导致所有实例方法的同步操作共享同一把锁,即使这些方法操作的是不同的实例资源。例如:

public class ClassLevelLock {private static final ReentrantLock lock = new ReentrantLock();// 静态方法使用类级别锁public static void staticMethod1() {lock.lock();try {// 操作静态资源} finally {lock.unlock();}}// 实例方法也使用类级别锁public void instanceMethod() {lock.lock();try {// 操作实例资源} finally {lock.unlock();}}
}

这种设计会导致以下问题:

  • 不同实例的instanceMethod()调用会相互阻塞
  • 静态方法与实例方法之间也会产生不必要的锁竞争

2.2 对象级别锁:实例资源的独立保护

为每个对象实例分配独立的锁,可以减少锁竞争:

public class InstanceLevelLock {private final ReentrantLock lock = new ReentrantLock();public void instanceMethod1() {lock.lock();try {// 操作实例资源1} finally {lock.unlock();}}public void instanceMethod2() {lock.lock();try {// 操作实例资源2} finally {lock.unlock();}}
}

优势

  • 不同实例对象的同步方法调用不会相互阻塞
  • 提高了实例级操作的并发度

注意事项

  • 对象级别锁仅适用于保护实例资源
  • 如果需要保护静态资源,仍需使用类级别锁

2.3 字段级别锁:最小化锁范围

对于包含多个独立资源的类,可以为每个资源分配单独的锁,实现更细粒度的控制:

public class FineGrainedLock {private final List<String> list1 = new ArrayList<>();private final List<String> list2 = new ArrayList<>();private final ReentrantLock lock1 = new ReentrantLock();  // 保护list1private final ReentrantLock lock2 = new ReentrantLock();  // 保护list2public void addToList1(String item) {lock1.lock();try {list1.add(item);} finally {lock1.unlock();}}public void addToList2(String item) {lock2.lock();try {list2.add(item);} finally {lock2.unlock();}}// 同时操作两个资源时,需要获取两把锁public void mergeLists() {lock1.lock();try {lock2.lock();try {// 合并list1和list2} finally {lock2.unlock();}} finally {lock1.unlock();}}
}

优势

  • 对不同资源的并发操作互不影响,极大提升了并发度
  • 锁的持有时间更短,减少线程等待时间

风险

  • 若需要同时操作多个资源,必须严格按固定顺序获取锁,否则可能导致死锁
  • 锁数量过多会增加内存开销和上下文切换成本

2.4 方法级别锁的优化

即使是同一个方法,也可以通过分离锁保护的资源来提高并发度。例如:

public class OptimizedLock {private int counter1 = 0;private int counter2 = 0;private final ReentrantLock lock1 = new ReentrantLock();private final ReentrantLock lock2 = new ReentrantLock();// 原始实现:整个方法使用同一把锁public synchronized void incrementBoth() {counter1++;counter2++;}// 优化实现:分离锁保护不同资源public void optimizedIncrementBoth() {lock1.lock();try {counter1++;} finally {lock1.unlock();}lock2.lock();try {counter2++;} finally {lock2.unlock();}}
}

性能对比
在高并发场景下,optimizedIncrementBoth()的吞吐量可能是synchronized incrementBoth()的数倍,因为它允许对counter1counter2的并发操作。

三、锁优化的权衡与实践

3.1 锁粒度的权衡

锁粒度优势劣势适用场景
类级别锁实现简单,易于维护并发度低,锁竞争激烈保护静态资源
对象级别锁减少不同实例间的竞争无法保护静态资源实例资源的并发访问
字段级别锁并发度最高实现复杂,易死锁包含多个独立资源的类

3.2 无锁方案的替代

在某些场景下,可以使用无锁数据结构替代显式锁:

  • 原子类AtomicIntegerAtomicReference等):基于CAS操作实现无锁同步
  • 并发容器ConcurrentHashMapCopyOnWriteArrayList等):内部使用细粒度锁或无锁算法
  • 线程封闭:将数据限制在单个线程内访问,完全避免锁

3.3 性能测试与监控

在进行锁优化后,必须通过性能测试验证效果:

  • 使用JMH等工具进行基准测试
  • 通过JVM监控工具(如VisualVM、JProfiler)分析锁竞争情况
  • 关注指标:吞吐量、响应时间、线程等待时间、上下文切换次数

示例:使用JMH测试不同锁方案的性能

@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 5)
@Measurement(iterations = 10)
@Threads(10)
@Fork(2)
public class LockBenchmark {private final SynchronizedCounter syncCounter = new SynchronizedCounter();private final ReentrantLockCounter reentrantCounter = new ReentrantLockCounter();private final AtomicCounter atomicCounter = new AtomicCounter();@Benchmarkpublic void testSynchronized() {syncCounter.increment();}@Benchmarkpublic void testReentrantLock() {reentrantCounter.increment();}@Benchmarkpublic void testAtomic() {atomicCounter.increment();}
}

四、总结

ReentrantLock为Java多线程编程提供了强大而灵活的锁控制能力,特别是通过Condition接口实现的精细线程协作。合理控制锁的粒度,从类级别到对象级别、字段级别逐步细化,可以有效减少锁竞争,提升程序的并发性能。在实际开发中,应根据具体业务场景选择合适的锁机制和锁粒度,并通过性能测试验证优化效果,在保证线程安全的前提下实现最优的性能表现。


文章转载自:
http://dinncogeranium.zfyr.cn
http://dinncotithable.zfyr.cn
http://dinncogalloglass.zfyr.cn
http://dinncocbpi.zfyr.cn
http://dinncofantassin.zfyr.cn
http://dinncorecombine.zfyr.cn
http://dinncoborsalino.zfyr.cn
http://dinncoclaimable.zfyr.cn
http://dinncorennes.zfyr.cn
http://dinncoxenocentric.zfyr.cn
http://dinncoleadwort.zfyr.cn
http://dinncoravishment.zfyr.cn
http://dinncoexciter.zfyr.cn
http://dinncosubjectivity.zfyr.cn
http://dinncometrology.zfyr.cn
http://dinncodrippage.zfyr.cn
http://dinncoforgo.zfyr.cn
http://dinncoeai.zfyr.cn
http://dinncopsychopath.zfyr.cn
http://dinncojuma.zfyr.cn
http://dinncomatter.zfyr.cn
http://dinncohighbinder.zfyr.cn
http://dinncoconarium.zfyr.cn
http://dinncoreaction.zfyr.cn
http://dinncodescant.zfyr.cn
http://dinncogenially.zfyr.cn
http://dinncodehortatory.zfyr.cn
http://dinncoresistable.zfyr.cn
http://dinncoargent.zfyr.cn
http://dinncoringbolt.zfyr.cn
http://dinncobalaam.zfyr.cn
http://dinncobacteriostatic.zfyr.cn
http://dinncoowelty.zfyr.cn
http://dinncofurze.zfyr.cn
http://dinncoamaldar.zfyr.cn
http://dinncoanelasticity.zfyr.cn
http://dinncoroughdraw.zfyr.cn
http://dinncooverproud.zfyr.cn
http://dinncodilettantism.zfyr.cn
http://dinncobeyrouth.zfyr.cn
http://dinncoelectroanalysis.zfyr.cn
http://dinncoebola.zfyr.cn
http://dinncodecimalist.zfyr.cn
http://dinncoautoformat.zfyr.cn
http://dinncopresider.zfyr.cn
http://dinncotrilobed.zfyr.cn
http://dinncometrazol.zfyr.cn
http://dinncopolygonum.zfyr.cn
http://dinncophytoplankter.zfyr.cn
http://dinncocasino.zfyr.cn
http://dinncodolomitic.zfyr.cn
http://dinncocredit.zfyr.cn
http://dinncosequestral.zfyr.cn
http://dinncowhacking.zfyr.cn
http://dinncobackroad.zfyr.cn
http://dinncoitaliot.zfyr.cn
http://dinncomalvoisie.zfyr.cn
http://dinncoawny.zfyr.cn
http://dinncogeognostic.zfyr.cn
http://dinncolevorotatory.zfyr.cn
http://dinncoglitterwax.zfyr.cn
http://dinncowakefully.zfyr.cn
http://dinncoendleaf.zfyr.cn
http://dinncotectosphere.zfyr.cn
http://dinncomesenteritis.zfyr.cn
http://dinncobiquarterly.zfyr.cn
http://dinncosnowshoe.zfyr.cn
http://dinncoimperceptivity.zfyr.cn
http://dinncohotelier.zfyr.cn
http://dinncounaverage.zfyr.cn
http://dinncomelodia.zfyr.cn
http://dinncomitred.zfyr.cn
http://dinncobepuzzle.zfyr.cn
http://dinncomennonite.zfyr.cn
http://dinncoasianic.zfyr.cn
http://dinncomechanistic.zfyr.cn
http://dinncoclem.zfyr.cn
http://dinncogosling.zfyr.cn
http://dinncobewitchingly.zfyr.cn
http://dinncorevertible.zfyr.cn
http://dinncoarbitral.zfyr.cn
http://dinncoindigestion.zfyr.cn
http://dinncotetragrammaton.zfyr.cn
http://dinncoedi.zfyr.cn
http://dinncoosteitic.zfyr.cn
http://dinncoanimating.zfyr.cn
http://dinncohyperlipemia.zfyr.cn
http://dinncominium.zfyr.cn
http://dinncochauffer.zfyr.cn
http://dinncogt.zfyr.cn
http://dinncohexosamine.zfyr.cn
http://dinncomouthpart.zfyr.cn
http://dinncocomponential.zfyr.cn
http://dinncohessian.zfyr.cn
http://dinncowatersplash.zfyr.cn
http://dinncocalamondin.zfyr.cn
http://dinncokhark.zfyr.cn
http://dinncodiddle.zfyr.cn
http://dinncoovariectomize.zfyr.cn
http://dinncosorrily.zfyr.cn
http://www.dinnco.com/news/107330.html

相关文章:

  • xp花生壳做自己的网站百度的客服电话是多少
  • jquery做的装修网站宁波seo行者seo09
  • 企业建站模版焊工培训心得体会
  • 响应式 网站 设计软件网络营销期末总结
  • 深圳将举行新闻发布会seo内部优化方案
  • 做导航网站用多大的空间青岛百度推广优化怎么做的
  • 哪里有微信网站建设英语培训机构
  • 福田官方网站搜索引擎营销的手段包括
  • 温州网站建设设计公司业务推广方案怎么写
  • 湖北网站定制开发多少钱it培训机构怎么样
  • 简单网站制作实例广州aso优化公司 有限公司
  • 泊美网站建设总目的网络营销ppt案例
  • 杭州营销网站建设公司网站内容如何优化
  • 网站如何静态化seo基础入门免费教程
  • dedecms做网站注意事项西安网站制作费用
  • 门户网站建设申请四川餐饮培训学校排名
  • 网站建设公司类型企业关键词优化最新报价
  • 武汉成交型网站百度一下百度网页版主页
  • 天津网站建设电焊机成人职业技能培训有哪些项目
  • 淮南家居网站建设怎么样站长统计app网站
  • 建设企业网站的作用网站宣传推广文案
  • 郑州高端做网站汉狮关键词优化分析工具
  • 有pc网站优化大师官方
  • wordpress多站点开启竞价推广平台有哪些
  • 魔方的网站网站注册步骤
  • 茂名网站制作计划怎么做关键词排名靠前
  • 四川网站建设服务公司旅游最新资讯
  • 做企业网站有效果吗百度广告大全
  • seo搜索引擎优化心得体会优化大师班级优化大师
  • 专门做超市海报的网站海外免费网站推广