1.一个线程只能调用一次start? 线程是怎么实现复用的呢?

Thread.start()只能调用一次,一旦这个调用结束,则该线程就到了stop状态,不能再次调用start__。
则要达到复用的目的,则必须从Runnable接口的run()方法上入手,可以这样设计这个Runnable.run()方法(就叫外面的run()方法):它本质上是个无限循环,跑的过程中不断检查我们是否有新加入的子Runnable对象(就叫内部的runnable:run()吧,它就是用来实现我们自己的任务),有就调一下我们的run(),其实就一个大run()把其它小run()#1,run()#2,…给串联起来了

屏幕快照 2019-11-03 11.31.40 AM.png

_

2. rmi 和 rpc 是什么?区别?

  1. remote method invokeremote process calllrmi只能是jdk支持。rpc不限。

3. 操作系统的内核态是可以直接访问一个JAVA进程中的任何地址的,为什么还有必要申请堆外内存?直接使用堆内 内存不行吗?

  1. 最主要的是,通过JNI调用对象,若触发GC时候,对象可能会被回收。堆外内存还有可以复用。

4.sleep 与 park 的区别?

sleep 需要时间。park 打断不会抛异常。

5.线程 的 interrupt() interrupted() isInterrupted()?

6.如何并发的遍历一个list?

7.关于 java 的 伪共享?CPU多级缓存的一致性?

当多个线程并发修改相互独立的变量时,如果恰好这些变量在同一个缓存行,就会带来损失。总会有一个CPU 提前修改了一个缓存行,MESI保证会及时通知到其它CPU,失效。如何做,在java编译器层级做缓存行头部填充,但是这也会带来缓存的浪费。JMM 屏蔽了对各种操作系统和CPU 对内存访问 的差异性。

8.happens before 规则

通过一定的关键字保证 A happens before B。A的结果对B可见。

9.获取String的classLoader?

获取为null,因为String 和的加载器是 bootstrap。且出于安全,防止替换。

10.为什么synchronized无法禁止指令重排,却能保证有序性?

  1. 虽然很多硬件都会为了优化做一些重排,但是在Java中,不管怎么排序,都不能影响单线程程序的执行结果。这就是as-if-serial语义,所有硬件优化的前提都是必须遵守as-if-serial语义。<br />当某个线程执行到一段被synchronized修饰的代码之前,会先进行加锁,执行完之后再进行解锁。在加锁之后,解锁之前,其他线程是无法再次获得锁的,只有这条加锁线程可以重复获得该锁.<br />synchronized通过排他锁的方式就保证了同一时间内,被synchronized修饰的代码是单线程执行的。所以呢,这就满足了as-if-serial语义的一个关键前提,那就是**单线程**,因为有as-if-serial语义保证,单线程的有序性就天然存在了。

11.为什么自定义ClassLoader 不能加载java.lang包?

jvm 标识一个class。是通过一个classloader 实例 和 类全路径。