SEO基础

SEO基础

Products

当前位置:首页 > SEO基础 >

如何在广州找到适合做餐饮的免费招聘网站?

96SEO 2026-02-20 06:04 0


基本…JUC系列整体栏目

内容链接地址【一】深入理解JMM内存模型的底层实现原理https://zhenghuisheng.blog.csdn.net/article/details/132400429【二】深入理解CAS底层原理和基本使用https://blog.csdn.net/zhenghuishengq/article/details/132478786【三】熟练掌握Atomic原子系列基本使用https://blog.csdn.net/zhenghuishengq/article/details/132543379【四】精通Synchronized底层的实现原理https://blog.csdn.net/zhenghuishengq/article/details/132740980【五】通过源码分析AQS和ReentrantLock的底层原理https://blog.csdn.net/zhenghuishengq/article/details/132857564【六】深入理解Semaphore底层原理和基本使用https://blog.csdn.net/zhenghuishengq/article/details/132908068【七】深入理解CountDownLatch底层原理和基本使用https://blog.csdn.net/zhenghuishengq/article/details/133343440【八】深入理解CyclicBarrier底层原理和基本使用https://blog.csdn.net/zhenghuishengq/article/details/133378623

如何在广州找到适合做餐饮的免费招聘网站?

一深入理解CyclicBarrier的底层原理1CyclicBarrier的基本使用2CyclicBarrier的底层源码实现2.1lock加锁操作2.2条件队列入队操作2.3同步状态器state设置为02.4条件队列Node结点阻塞2.5signalAll满足屏障条件进入下一屏障2.6条件队列结点出队2.7条件队列结点入队同步队列2.8unlock解锁

3总结

在前面两篇讲述了Semaphore和CountDownLatch两个并发工具类都是通过CLH等待队列实现的接下来讲解第三个常用的并发工具类CyclicBarrier

外还用了条件等待队列来实现的接下来详细的描述一下该类的基本语法和底层的源码实现。

顾名思义可以被称为循环屏障屏障指的是可以让多个线程在满足某一个条件的时候再全部的同时执行有点类似于之前的内存屏障循环指的是这个条件可以一直循环的使用

先举一个简单的例子了解一下这个工具类是如何使用的。

在此之前先定义一个线程池通过线程池工具类来管理线程

package

debug,低级别的会输出高级别的信息高级别的不会输出低级别的信息private

static

LoggerFactory.getLogger(ThreadPoolUtil.class);//构建线程池public

static

null;//向线程池中添提交任务,将任务返回//判断核心线程数数量阻塞队列创建非核心线程数拒绝策略public

static

getThreadPool().submit(runnable);//将任务存储在hash表中return

future;}/***

cpu密集型最大核心线程数为N或者N1N可以充分利用cpu资源N加1是为了防止缺页造成cpu空闲*

static

Runtime.getRuntime().availableProcessors();log.info(当前机器的cpu的个数为

cpuNum);int

ThreadPoolExecutor(maximumPoolSize

//链表无界队列Executors.defaultThreadFactory(),

ThreadPoolExecutor.AbortPolicy());

//直接抛异常默认异常}return

java.util.concurrent.CyclicBarrier;/***

author

cyclicBarrier;//通过构造方法传参保证拿到的是同一个对象public

Task(CyclicBarrier

cyclicBarrier){this.cyclicBarrier

void

{System.out.println(Thread.currentThread().getName()

开始等待其他线程);cyclicBarrier.await();System.out.println(Thread.currentThread().getName()

开始执行);//TODO

模拟业务处理Thread.sleep(5000);System.out.println(Thread.currentThread().getName()

执行完毕);}

ThreadPoolUtil.getThreadPool();public

static

CyclicBarrier(5);//创建20个线程任务for

(int

Task(cyclicBarrier);//提交任务threadPool.submit(task);}}

}查看执行结果如下

com.zhs.study.util.ThreadPoolUtil

pool-1-thread-5开始执行

主要就是当线程累加到5个之后就会通过这个屏障执行以下的业务如果没有达到5个就会被阻塞着。

与CountDownLatch的底层实现不同后者是通过减法的方式实现业务而循环屏障使用的是加法并且循环屏障的参数是可以循环使用的而CountDownLatch不能。

接下来研究一下CyclicBarrier

这个类先查看一下这个类中的部分属性和构造方法。

内部引入了ReentrantLock和trip条件队列对象并且定义了一个重置内存屏障的对象在构造方法中除了引用一个正常的类加的数据之外还引入了一个副本参数用于循环使用

public

false;}//引入了ReentrantLock锁因此有AQS的所有特性以及该锁的特性private

final

ReentrantLock();//条件对象用于构建条件等待队列private

final

lock.newCondition();//构造方法如下public

CyclicBarrier(int

IllegalArgumentException();this.parties

parties;

//外部参数的个数用于累计this.barrierCommand

barrierAction;

cyclicBarrier.await();接下来进入这个await方法内部在源码中一般真正干活的方法都是以do开头的方法

public

方法中这个方法内部逻辑是比较多的如下图接下来会一段一段的分析这里面的方法

2.1lock加锁操作

首先在该方法中定义了一把ReentrantLock锁并进行了一个加锁的操作。

这个操作其实也不难理解因为在条件等待队列中需要加锁在能阻塞就类似于使用wait方法时必须在外层加synchronized关键字的

final

如在CyclicBarrier构造方法中会有一个count用于做具体的执行操作因此在这会有一个自减的操作如果这个count的自减操作的值不为0那么会继续进入下面这个for循环的自旋操作首先会有一个trip.await方法用于条件等待队列进行入队操作

int

{//trip是一个条件等待队列对象调用的这个await是条件等待的入队和阻塞if

(!timed)

{Thread.currentThread().interrupt();}}if

(g.broken)

}接下来查看这个await方法的具体实现里面首先会有一个addConditionWaiter

public

//判断是不是同步等待队列结点LockSupport.park(this);

((interruptMode

checkInterruptWhileWaiting(node))

(acquireQueued(node,

cancelledunlinkCancelledWaiters();if

(interruptMode

0)reportInterruptAfterWait(interruptMode);

}这个Node对象是ConditionObject类下面声明的对象在ConditionObject这个对象中只对了Node结点的头指针和尾指针因此组成这个条件等待的队列是一个由Node结点组成的单向链表CLH同步等待队列中的Node结点和这个Condition条件等待队列的Node结点是同一个类的对象只是实现两种队列的结构不一样。

public

1173984872572414699L;//定义头结点private

transient

}结点入队的操作如下首先会先修改Node结点的状态为-2条件等待状态其次会判断这个单向链表是否存在如果存在则直接将结点加入到单向链表的尾部如果不存在则直接将结点作为头结点。

private

//如果链表存在则直接将结点插入到尾结点中}//设置结点的waitStatus为-2即为条件等待状态Node

node

//如果链表存在则直接将链表接入到队尾即可lastWaiter

node;

方法由于在一开始调用了lock方法这个lock是一把独占锁其内部也是通过CLH同步等待队列实现因此也是通过修改state的值来让其他线程可以来抢锁因此需要通过这个

fullyRelease

IllegalMonitorStateException();}}

finally

方法来进行释放锁最终会调用tryRelease方法将同步状态器中的state的值设置为0并且将exclusive的值设置为null主要从外面进来的线程(非队列中的阻塞线程)就可以去抢锁。

protected

getExclusiveOwnerThread())throw

new

IllegalMonitorStateException();boolean

free

true;setExclusiveOwnerThread(null);

//exclusive设置为null}setState(c);

//设置为0return

依旧是2.2的await方法中会有一个判断当前结点是不是同步等待队列中的结点很明显不是因此会进入方法内部就会有一个park方法阻塞的功能

while

//判断是不是同步等待队列结点LockSupport.park(this);

((interruptMode

checkInterruptWhileWaiting(node))

0)break;

如果此时的count值被减为0那么就会跳过这个循环屏障即可以执行这个循环屏障并且会判断构造方法的参数中是否有这个线程任务如果有则优先执行这个线程任务

int

}进入下一个循环屏障的nextGeneration方法的具体实现如下里面会有一个signalAll

private

}通过下图可以更加直观的分析流程通过await将Node结点加入到队列并让结点阻塞那么可以直接通过这个signalAll方法将结点从同步等待队列中唤醒但是唤醒之后结点的状态还是-2因此需要解决park的唤醒还是得加入到同步等待队列中通过同步等待队列的唤醒机制将状态改成-1才能去抢锁才能最终的释放锁和唤醒线程。

因此继续分析这个signalAll方法其实现如下具体的唤醒方法在doSignalAll中实现并且首先唤醒的是头结点

public

IllegalMonitorStateException();Node

first

里面首先会将条件队列的头结点和尾结点置为null随后通过first结点执向头结点随后将头结点的下一个结点也置为空此时头结点出队。

随后通过dowhile的方式会将所有的结点遍历一遍此时所有的结点出队

private

first.nextWaiter;first.nextWaiter

null;

//将头结点的下一个结点也置为nulltransferForSignal(first);first

next;

由于只有同步队列中才能去唤醒线程因此只能将出队的队列加入到同步等待队列中因此查看这个transferForSignal方法底层的具体实现。

此时会先修改结点的状态改成0其次会有一个结点的enq入队操作前面几篇都有写这个具体实现。

final

(!compareAndSetWaitStatus(node,

Node.CONDITION,

Node.SIGNAL))LockSupport.unpark(node.thread);

return

}入队的操作依旧是那些双向链表不存在则创建存在则直接将结点加入随后修改状态为-1可被唤醒状态随后结点阻塞详细可以看前面三篇文章

2.8unlock解锁

lock.unlock();此时结点已经从条件队列中入队到同步等待队列中此时条件等待队列的结点都是处于阻塞的并且状态都为-1因此需要通过这个unlock方法去对里面的对象进行唤醒和出队的功能内部最终会调用这个unpark这个方法

LockSupport.unpark(s.thread);在被唤醒之后又会调用这个acquireQueued

acquireQueued()获取锁之后进入同步队列的结点出队。

(同步队列的具体实现看前两篇写烂了…)

setHead(node);

false;通过unlock方法可以不断的出队和唤醒下一个线程这样就能将进入同步队列的条件队列结点给全部唤醒这样就可以执行参数定义为n个线程了。

3总结

在整个流程中可以发现在刚进入是需要加lock获取锁在await方法中当结点进入条件队列之后有会释放锁然后在条件队列结点进入同步队列时又会去抢锁然后在执行完毕时又会释放锁总共会有两次加锁和解锁的过程

第一次lock获取锁配合await使用

第一次await释放锁将state的值置为0允许外部线程和同步队列线程结点抢锁

第二次获取锁条件队列结点进入同步队列时抢锁成功执行逻辑失败进入同步队列阻塞

第二次unlock释放锁同步队列执行完逻辑之后需要唤醒同步队列中阻塞的结点

循环屏障是通过ReentrantLock和条件队列配合使用的ReentrantLock中底层通过AQS实现因此满足了同步队列和条件队列的同时使用。

首先可以在循环屏障中定义一个参数用于表示需要满足的条件随后线程会调用这个await方法先通过lock进行一个加锁操作随后结点会进入条件等待队列此时结点的状态为-2在结点阻塞之后会将同步状态器的state值改成0锁就进行了释放此时就会允许外部的线程进行一个抢锁的操作

当满足这个循环屏障的条件的时候此时就会进入下一个循环屏障那么就需要将条件队列的结点进行一个出队的操作由于唤醒线程只有在同步队列中实现因此还要将结点加入到同步队列中入队时又会有一个cas锁的操作如果抢锁成功则执行逻辑如果抢锁失败则加入到同步队列中并阻塞当获取锁成功之后需要结点出队并且唤醒同步队列中被阻塞的结点因此需要调用最终的unlock方法



SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback