一.CAS(compare and swap)
Unsafe 用于实现CAS(compare and swap) 操作,基于CPU一条原始指令,是原子的线程安全的,可用于多线程间非阻塞方式实现线程安全。
多线程中如果有多个线程修改共享变量,一般使用synchronized ,只有一个线程获得锁可以修改,其它线程阻塞等待锁释放, Unsafe.compareAndSwapXXX 使用比较再交换方式:
AbstractQueuedSynchronizer类中有实现:
private transient volatile Node tail;//volatile 用于可见性
private static final Unsafe unsafe = Unsafe.getUnsafe();//获取对象
static final long tailOffset = unsafe.objectFieldOffset(AbstractQueuedSynchronizer.class.getDeclaredField("tail"));//获取 AbstractQueuedSynchronizer对象 tail字段在内存中的相对偏移量,用于修改内存值
unsafe.compareAndSwapObject(this( AbstractQueuedSynchronizer 对象), tailOffset, expect, update);//如果内存值与 expect值相同,则修改其值为 update新值。
线程安全性在于如果内存值与 expect值相同,则认为没有其它线程修改,则更新并返回真, 否则返回假compareAndSwapObject本身是原子的。所以线程是安全的。
一般常用方法:
public final long getAndSet(long newValue) {
while (true) {//无限循环直至设置成功
long current = get();//获取前值
if (unsafe.compareAndSwapLong(this, valueOffset, current, newValue));//如果当前值与主内存值相等则设为新值。
return current;
}
}
二.线程的挂起与恢复
Unsafe.park(Thread) //阻塞线程
Unsafe.unPark(Thread) //唤醒线程,如果该线程未阻塞,该线程下次调用park方法时,直接返回,不阻塞。
线程池程序执行时,用jstack查看进程状态时,常看到Unsafe.park
/** * 获取Unsafe对象 * */ public class AppUnsafeUtils { private static final Unsafe _unsafe; static{ Unsafe temp= null; try { Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); temp= (Unsafe) field.get(null); }catch (Exception e){ Throwables.propagate(e); } _unsafe = temp; } public static final Unsafe getUnsafe() { return _unsafe; } }
相关推荐
sun.misc.Unsafe源码文件,需要学习的带走。希望能够帮助到大家。
JDK8中sun.misc包下的UnSafe类,想查看源码的就拿走,没积分的请与我联系!xtfggef@gmail.com
JDK8中sun.misc下UnSafe类源代码 UnSafe.java JDK8中sun.misc下UnSafe类源代码 UnSafe.java
解决VS中This function or variable may be unsafe的安全检查错误
对Netty中的Unsafe做了简单的总结,构建自己的知识网!!!
解决VS中This function or variable may be unsafe的安全检查错误
CS使用Unsafe的方法向DLL传参 由一个实例开始: c++中函数声明如下: bool Test(float** arr,int rows,int cols); 这个函数在C#中怎么使用,直接传入single[,]出现错误”尝试读取或写入受保护的内存",那到底...
并发作为 Java 中非常重要的一部分,其内部大量使用了 Unsafe 类,它为 java.util.concurrent 包中的类提供了底层支持。
Unsafe类是rt.jar包中的类,它提供了原子级别的操作,它的方法都是native方法,通过JNI访问本地的C++库。它的出现是为了解决在高并发下的数据同步问题。synchronize关键字修饰的代码块被加了独占锁,相同时间只能有...
unsafe-helper-包含一些简单的方法,这些方法使使用sun.misc.Unsafe更容易。 unsafe-collection-在ArrayList上建模的示例列表,该列表不存储对集合内对象的引用,而是直接将元素复制到列表中。 这有一些有趣的特性...
Java Unsafe类1
在阅读AtomicInteger的源码时,看到了这个类:sum.msic.Unsafe,之前从没见过。所以花了点时间研究了下,下面这篇文章主要给大家介绍了关于Java中Unsafe类的相关资料,需要的朋友可以参考借鉴,下面来一起学习学习吧
java魔法类:Unsafe应用
spark-unsafe_2.11-2.4.0-cdh6.1.1.jar
spark-unsafe_2.11-2.1.3-SNAPSHOT.jar
Unsafe jdk1.5 rt.jar, 导入lib->build path->add jar, 选中即可使用。亲测有效
Unsafe类介绍 第一次看到这个类时被它的名字吓到了,居然还有一个类自名Unsafe?读完本文,大家也能发现Unsafe类确实有点不那么安全,它能实现一些不那么常见的功能。 Unsafe类使Java拥有了像C语言的指针一样操作...
System.Runtime.CompilerServices.Unsafe
但go对指针还是留了一扇不起眼的窗来进行指针运算,这扇窗就是unsafe包。 首先unsafe包的内容并不多,只有寥寥几个数据结构和函数。要使用unsafe包需要先了解内存对齐,对有c使用经验的朋友就比较简单了。数据在内存...
基于DEMATEL和ISM方法的煤矿不安全行为影响因素及模式研究,李爽,吴雪,煤矿生产中,在机器设计和布置合理的情况下,控制人的不安全行为显得尤为重要。不安全行为的发生是诸多因素相互作用的结果,本文