您现在的位置是:主页 > news > 怎样做网站的关键字搜索功能/链接交换公司
怎样做网站的关键字搜索功能/链接交换公司
admin2025/5/25 17:10:49【news】
简介怎样做网站的关键字搜索功能,链接交换公司,怎么做传奇私服广告网站,做网站得叫什么文章目录CAS原理理解通过Java代码测试CAS原理理解 CAS算法,全名叫CompareAndSwap ,即:比较与交换。 接下来采取多个线程同时操作同一个共享变量逻辑图的方式,说明什么是CAS。 1、假设此时的内存中,该共享变量的数据值…
怎样做网站的关键字搜索功能,链接交换公司,怎么做传奇私服广告网站,做网站得叫什么文章目录CAS原理理解通过Java代码测试CAS原理理解
CAS算法,全名叫CompareAndSwap ,即:比较与交换。
接下来采取多个线程同时操作同一个共享变量逻辑图的方式,说明什么是CAS。 1、假设此时的内存中,该共享变量的数据值…
文章目录
- CAS原理理解
- 通过Java代码测试
CAS原理理解
CAS
算法,全名叫CompareAndSwap
,即:比较与交换
。
接下来采取多个线程同时操作同一个共享变量
逻辑图的方式,说明什么是CAS
。
1、假设此时的内存中,该共享变量
的数据值为:except = 0。
2、当多个线程对该共享变量进行数据变更时,会将共享变量的数据拷贝副本至自己的工作内存中
。
3、对指定的工作内存
中的数据进行修改操作,假设线程一需要将数据修改成1,此时则绑定一个变量信息为refresh = 1;同理线程2则为refresh = 2。
4、当CPU需要将值写回主内存中时,则去对比两者的 except 数据值
;当匹配,则进行修改操作;否则修改失败。
【注意:】CAS是计算机的一种 原子操作!
也就表明CAS算法,操作数据进行比较和交换具有原子性!即:任意时刻只能保证一个线程能执行成功!
通过Java代码测试
package aqs;import jmm.UnsafeInstance;
import lombok.extern.slf4j.Slf4j;
import sun.misc.Unsafe;import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;@Slf4j
public class UnsafCasTest {/*** 当前加锁状态,记录加锁的次数*/private volatile int state = 0;public int getState() {return state;}// 容量为5的几个计数器private static CyclicBarrier cyclicBarrier = new CyclicBarrier(5);// Java本身是无法直接修改内存的,但是C++可以,这个类是Java的一个可以修改内存操作的工具类private static final Unsafe unsafe = UnsafeInstance.reflectGetUnsafe();// 自定义的一个比较和交换的操作方法public final boolean compareAndSwapState(int oldValue,int newValue){/*** 原则:符合期望的数据时,则将指定的变量的数据进行更新;否则不更新!* 参数一:指定的某个类* 参数二:指定类中,参与比较的某个属性的偏移值(相当于就是该变量在内存中的位置)* 参数三:期望数据值* 参数四:待更新的值*/return unsafe.compareAndSwapInt(this,stateOffset,oldValue,newValue);}// 指定属性在内存中的偏移数据private static final long stateOffset;static {try {stateOffset = unsafe.objectFieldOffset(UnsafCasTest.class.getDeclaredField("state"));log.info("stateOffset={}",stateOffset);} catch (Exception e) {throw new Error();}}// static 供内部类进行访问private static UnsafCasTest unsafCasTest = new UnsafCasTest();public static void main(String[] args) {// 开启5个线程new Thread(new Worker(),"t-0").start();new Thread(new Worker(),"t-1").start();new Thread(new Worker(),"t-2").start();new Thread(new Worker(),"t-3").start();new Thread(new Worker(),"t-4").start();}// 自定义内部类static class Worker implements Runnable{@Overridepublic void run() {log.info("请求:{}到达预定点,准备开始抢state:)",Thread.currentThread().getName());try {// 每个线程创建后,进行等待操作int await = cyclicBarrier.await();log.info("{}---》当前等待数据:{}",Thread.currentThread().getName(),String.valueOf(await));if(unsafCasTest.compareAndSwapState(0,1)){log.info("当前请求:{},抢到锁!",Thread.currentThread().getName());}else{log.info("当前请求:{},抢锁失败!",Thread.currentThread().getName());}} catch (InterruptedException| BrokenBarrierException e) {e.printStackTrace();}}}
}