关于修改和代理Final类和方法?

背景

cglib是基于继承的代理的,但是final修饰的类的方法不能被代理,毕竟虚拟机规范限定了final关键字,想要实现代理的功能,自己不要加上final就是了。但是现在别人写好了库里的类,不方便修改想要尝试。

阅读更多

Java指令重排

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Main{
static boolean mark = true;
public static void main(String[] args) throws InterruptedException {
run();
/*加上这句会怎么样?*/
//Thread.sleep(100);
mrak = false;
System.out.println("main end");
}

static void run(){
new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
while (mark){
//这里具体要做什么也会影响到结果
i++;
}
}
}).start();
}
}
阅读更多

仿写一个Java Thread 底层实现

Java里的线程和操作系统的线程是一一对应的,为了方便理解Thread 类的底层实现,我们可以自己来仿造一个MyThread, 同样接受一个Runable接口,调用start实现run方法。

阅读更多

关于Spark 集群中调度GPU的一些实验

自己毕设做了一些Spark 调用GPU 相关的实验,自己也在网上找到了一些资料,也写下来分享一些自己的做法。

目前Spark(2.3) 还不支持直接调用GPU , 需要自己通过JNI的方式实现调用GPU来做一些加速计算。通常是自己定义好接口,在用NVCC生成动态链接库,然后在Spark中调用。

阅读更多

Cache与虚存的异同

虚拟存储器

虚拟存储器是一个容量非常大的存储器的逻辑模型,不是任何实际的物理存储器。
虚拟存储器指的是主存——外存层次。它以透明的方式给用户提供 了一个比实际主存空间大得多的程序地址空间。

阅读更多