最新Unsafe-Java永远的“神”(一),2024年华为Java面经

总结:心得体会

既然选择这个行业,选择了做一个程序员,也就明白只有不断学习,积累实战经验才有资格往上走,拿高薪,为自己,为父母,为以后的家能有一定的经济保障。

学习时间都是自己挤出来的,短时间或许很难看到效果,一旦坚持下来了,必然会有所改变。不如好好想想自己为什么想进入这个行业,给自己内心一个答案。

面试大厂,最重要的就是夯实的基础,不然面试官随便一问你就凉了;其次会问一些技术原理,还会看你对知识掌握的广度,最重要的还是你的思路,这是面试官比较看重的。

最后,上面这些大厂面试真题都是非常好的学习资料,通过这些面试真题能够看看自己对技术知识掌握的大概情况,从而能够给自己定一个学习方向。包括上面分享到的学习指南,你都可以从学习指南里理顺学习路线,避免低效学习。

大厂Java架构核心笔记(适合中高级程序员阅读):

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

System.out.println("String[] index scale is : " + scale);

// 获取数组中第n个元素 i = (baseOffset + (scale * n-1))

System.out.println(“third element is :” + unsafe.getObject(exampleArray, baseOffset + (scale * 2)));

// 修改数组中第n个元素 i = (baseOffset + (scale * n-1))

unsafe.putObject(exampleArray, baseOffset + scale * 2, “柒”);

System.out.println(“third element is :” + unsafe.getObject(exampleArray, baseOffset + (scale * 2)));

}

public static void main(String[] args) {

OperateArrayExample.operateArrayUseUnsafe();

}

}

输出结果

在这里插入图片描述

对象操作


package com.liziba.unsafe;

import com.liziba.unsafe.pojo.User;

import sun.misc.Unsafe;

import java.io.File;

import java.io.FileInputStream;

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

/**

  •  操作对象示例
    
  • @Author: Liziba

  • @Date: 2021/5/24 20:40

*/

public class OperateObjectExample {

/**

  • 1、public native Object allocateInstance(Class<?> var1); 分配内存

  • 2、public native Class<?> defineClass(String var1, byte[] var2, int var3, int var4, ClassLoader var5, ProtectionDomain var6); 方法定义一个类用于动态的创建类

  • @throws Exception

*/

public static void operateObjectUseUnsafe() throws Exception{

Unsafe unsafe = UnsafeFactory.getUnsafe();

// 使用Unsafe的allocateInstance()方法,可以无需使用构造函数的情况下实例化对象

User user = (User) unsafe.allocateInstance(User.class);

user.setId(1);

user.setName(“李子捌”);

System.out.println(user);

// 返回对象成员属性在内存中相对于对象在内存中地址的偏移量

Field name = User.class.getDeclaredField(“name”);

long fieldOffset = unsafe.objectFieldOffset(name);

// 使用Unsafe的putXxx()方法,可以直接修改内存地址指向的数据(可以越过权限访问控制符)

unsafe.putObject(user, fieldOffset, “李子柒”);

System.out.println(user);

// 使用Unsafe在运行时通过.class文件,创建类

File classFile = new File(“E:\workspaceall\liziba-javap5\out\production\liziba-javap5\com\liziba\unsafe\pojo\User.class”);

FileInputStream fis = new FileInputStream(classFile);

byte [] classContent = new byte[(int) classFile.length()];

fis.read(classContent);

Class<?> clazz = unsafe.defineClass(null, classContent, 0, classContent.length, null, null);

Constructor<?> constructor = clazz.getDeclaredConstructor(int.class, String.class);

System.out.println(constructor.newInstance(1, “李子玖”));

}

public static void main(String[] args) {

try {

OperateObjectExample.operateObjectUseUnsafe();

} catch (Exception e) {

e.printStackTrace();

}

}

}

输出结果

在这里插入图片描述

内存操作


package com.liziba.unsafe;

import sun.misc.Unsafe;

/**

  •  內存地址操作示例
    
  • @Author: Liziba

  • @Date: 2021/5/24 21:32

*/

public class OperateMemoryExample {

/**

  • 1、public native long allocateMemory(long var1); 分配var1字节大小的内存,返回起始地址偏移量

  • 2、public native long reallocateMemory(long var1, long var3); 重新给var1起始地址的内存分配长度为var3字节的内存,返回新的内存起始地址偏移量

  • 3、public native void freeMemory(long var1); 释放起始地址为var1的地址

  • 分配地址的方法还有重分配,都是分配在堆外内存,返回的是一个long类型的地址偏移量。这个偏移量在Java程序中的每一块内存都是唯一的

*/

public static void operateMemoryUseUnsafe() {

Unsafe unsafe = UnsafeFactory.getUnsafe();

// 申请分配8byte的内存

long address = unsafe.allocateMemory(1L);

// 初始化内存填充值

unsafe.putByte(address, (byte)1);

// 测试输出

System.out.println(new StringBuilder().append("address: “).append(address).append(” byte value: ").append(unsafe.getByte(address)));

// 重新分配一个地址

long newAddress = unsafe.reallocateMemory(address, 8L);

unsafe.putLong(newAddress, 8888L);

System.out.println(new StringBuilder().append("address: “).append(newAddress).append(” long value: ").append(unsafe.getLong(newAddress)));

// 释放地址,注意地址可能被其他使用

unsafe.freeMemory(newAddress);

System.out.println(new StringBuilder().append("address: “).append(newAddress).append(” long value: ").append(unsafe.getLong(newAddress)));

}

public static void main(String[] args) {

OperateMemoryExample.operateMemoryUseUnsafe();

}

}

输出结果

在这里插入图片描述

CAS操作


package com.liziba.unsafe;

import com.liziba.unsafe.pojo.User;

import sun.misc.Unsafe;

import java.lang.reflect.Field;

/**

  •  CAS操作示例
    
  • @Author: Liziba

  • @Date: 2021/5/24 22:18

*/

public class OperateCASExample {

/**

  • CAS == compare and swap(比较并替换)

  • 当需要改变的值为期望值的时候,就替换为新的值,是原子(不可再分割)操作。Java中大量的并发框架底层使用到了CAS操作。

  • 优势:无锁操作,减少线程切换带来的开销

  • 缺点:CAS容易在并发的情况下失败从而引发性能问题,也存在ABA问题。

  • Unsafe中提供了三个方法

  • 1、compareAndSwapInt

  • 2、compareAndSwapLong

  • 3、compareAndSwapObject

*/

public static void operateCASUseUnsafe() throws Exception {

User user = new User(1, “李子捌”);

System.out.println("pre user value: " + user);

Unsafe unsafe = UnsafeFactory.getUnsafe();

Field id = user.getClass().getDeclaredField(“id”);

Field name = user.getClass().getDeclaredField(“name”);

// 获取ID字段的内存偏移量

long idFieldOffset = unsafe.objectFieldOffset(id);

// 获取name字段的内存偏移量

long nameFieldOffset = unsafe.objectFieldOffset(name);

// 如果ID的期望值是1,则修改为18 success

unsafe.compareAndSwapInt(user, idFieldOffset, 1, 18);

// 如果name的期望值是小荔枝,则修改为李子柒 fail

unsafe.compareAndSwapObject(user, nameFieldOffset, “小荔枝”, “李子柒”);

// 输出修改的user对象

System.out.println("post user value: " + user);

}

public static void main(String[] args) {

try {

OperateCASExample.operateCASUseUnsafe();

} catch (Exception e) {

e.printStackTrace();

}

}

}

输出结果

在这里插入图片描述

线程的挂起和恢复

最后

小编精心为大家准备了一手资料

以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

BATJ面试要点及Java架构师进阶资料

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

957)]

以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

[外链图片转存中…(img-h8bm5eum-1715651270958)]

BATJ面试要点及Java架构师进阶资料

[外链图片转存中…(img-D9jIYg7h-1715651270958)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值