Java 并发 随笔 4-unsafe

0. 不知道咋说了…新年快乐吧

大佬的unsafe笔记(但是大佬的错别字有丶多…)

1. 总结

unsafe可以帮我们直接去操作硬件资源,当然了是借助JVM的jit来进行的

官方不推荐使用,因为不安全,例如你使用unsafe创建一个超级大的数组,但是这个数组jvm是不管理的,只能你自己操作,容易oom,也不利于资源的回收.

随便只要你高兴,都可以获取到unsafe实例,因为涉及到unsafe的权限问题,所以,我们只能使用反射方式获取,不然就是权限异常

unsafe对对象的修改,是可以越过权限,直接操作内存数据的

2. 能做的事情

获取数组元素的基本偏移量(数组的内存地址的偏移量)、数组元素间隔偏移量 => 基本偏移量 + 间隔偏移量 * 数组元素索引 => 获取、修改数组元素
通过类的Class对象创建实例,可以避开执行其构造器
获取、修改对象属性 => 获取对象属性的偏移量 => 需要传入属性的反射对象reflect.Field
当使用框架反序列化或者构建对象时,会假设从已存在的对象中重建 或者更准确一点是能直接设置内部字段甚至是final字段的函数。问题是你想创建一个对象的实例,但你实际上又不需要构造函数,因为它可能会使问题更加困难而且会有副作用。
直接给JAVA内存区域分配(allocateMemory)、修改内存(setMemory)
给指定的内存位置设置一些基本数据类型
CAS操作,当需要改变的值为期望的值时,那么就替换它为新的值,是原子(不可在分割)的操作。很多并发框架底层都用到了CAS操作,CAS操作优势是无锁,可以减少线程切换耗费的时间,但CAS经常失败运行容易引起性能问题,也存在ABA问题。
获取JVM的一些环境配置的常量(地址大小addressSize,页大小pageSize)
线程许可 许可线程通过(park),或者让线程等待许可(unpark)
堆外内存(off-heap memory)技术,在java.nio包中部分可用 这种方式的内存分配不在堆上,且不受GC管理,所以必须小心Unsafe.freeMemory()的使用。它也不执行任何边界检查,所以任何非法访问可能会导致JVM崩溃
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值