CAS *** 作
是通过compareAndSwapXXX方法实现的
/
比较obj的offset处内存位置中的值和期望的值,如果相同则更新。此更新是不可中断的。
@param obj 需要更新的对象
@param offset obj中整型field的偏移量
@param expect 希望field中存在的值
@param update 如果期望值expect与field的当前值相同,设置filed的值为这个新值
@return 如果field的值被更改返回true
/
public native boolean compareAndSwapInt(Object obj, long offset, int expect, int update);
CAS *** 作有3个 *** 作数,内存值M,预期值E,新值U,如果M==E,则将内存值修改为B,否则啥都不做。
首先介绍一下什么是Compare And Swap(CAS)?简单的说就是比较并交换。
CAS *** 作包含三个 *** 作数 —— 内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何 *** 作。无论哪种情况,它都会在 CAS 指令之前返回该位置的值。CAS 有效地说明了“我认为位置 V 应该包含值 A;如果包含该值,则将 B 放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。” Java并发包(javautilconcurrent)中大量使用了CAS *** 作,涉及到并发的地方都调用了sunmiscUnsafe类方法进行CAS *** 作。
在看一下volatile, Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的值是相同的,更简单一点理解就是volatile修饰的变量值发生变化时对于另外的线程是可见的。
如何正确使用volatile可以参考下面这篇文章:
>
解决办法。
1、对于E60将CAS控制单元的1脚KL30G、8脚KL15、19脚15wup人为连接12V电源,然后对车辆进行编程。
2、对于E65E66将CAS控制单元的48脚15wup、49脚KL15人为连接12V电源,然后对车辆进行编程。
3、对于新E70E71将CAS的1号7号8号14号19号脚人为连接12V电源,然后把OBD-II的1号脚(空)和16号脚对接。
4、对于OBD-II有1号脚线的老款车辆只需要短接1号和16号脚就可以编程通过以上方法对CAS编程)(新款车的CAS和FRM还有老款车的LM还有3系仪表里面有车辆数据的模块不要使用二手,如果一定要用二手零件号务必使用相等且车架号务必手工修改后对车辆才可以进行编程和设码工作))。
1、此故障主要原因是由于在对CAS编程过程中,数据传递受到干扰或由于线路等原因使数据传递失败,造成CAS内部程序混乱,不能依照一些指令正常工作。由于在编程时数据传输是从D-BUS到中央网关通过中央网关编译后传送到CAS,但中央网关是由CAS通过15wup或K-CAN唤醒,如果CAS功能异常后,将无发唤醒中央网关,也就是说SSS无法通过D-BUS连接到中央网关也无法再对车载模块进行编程。此时,只有依照以上方法人为唤醒中央网关,然后对CAS单独进行编程。
2、在正常使用过程中,CAS损坏车辆无法启动。其出现该故障的原因大多是由于车辆上的电器设备在工作时,一些感性元件(如点火线圈)本身性能或相关线路不良产生了干扰源,主要由电源干扰或空间干扰的方式串入CAS,使CAS程序错乱,造成车辆无法启动。一般通过以上方法可以恢复功能,但也有出现CAS硬件损坏的现象,这时,必须更换CAS。
模拟一般抢购活动中需要加锁的程序,采用synchronized锁与CAS锁,比较二者的性能。说明二者的区别,并指出合适应该使用CAS锁。
首先创建一个spring boot 的项目,不修改任何默认tomcat的配置,模拟抢购程序耗时100ms
这些程序的失败只是说明在压测是时间内程序没有响应(5s以上),后台继续在运行,用监控工具可以看到
实际上处理完1000个线程耗时的时间是两分钟(visualVM反应有点小迟钝),并且可以大致看出spring boot 默认的线程数大概在200(还有一些程序存活的守护线程,我们并不能利用起来),在内存时序图中,可以大致看到,新建一个线程,大概消耗10m的内存。
这些意味着如果你采用synchronized,两分钟内,你的服务处于假死状态(tomcat的线程被占完),不做测试的话其实也能估算出大概的耗时,毕竟主要就是抢购程序内部耗时,每个100ms,1000个就是两分钟左右,加锁的性能很低,不到万不得已不要加重锁。
换成CAS的 *** 作
根据测试的结果,可以大致判断CAS锁的使用场景:快速响应失败。比如会场活动,或者需要连续点击的抢购,不需要按时间点击顺序(这个需要mq的帮助)确定抢购结果的活动。
以上就是关于UnSafe类中的CAS *** 作全部的内容,包括:UnSafe类中的CAS *** 作、宝马CAS模块损坏故障现象是什么、CAS在项目中的应用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)