面试题目 - 001

线程安全本质是什么,Java 如何保证线程安全,callable,runnable 有什么区别,线程不正常终止会发生什么,线程占用的空间具体是哪,是寄存器还是内存还是什么

线程安全的本质就是由于多个线程在争抢资源,可能使得资源的一致性、完整性发生问题,导致程序的不正确执行。

Java 是怎么保证线程安全的?
提供一些关键字以及 API 精良的保证线程安全:
关键字:
volatile:能保证可见性、有序性、不能保证原子性,需要加上 Synchornized,底层的原理是内存屏障,内存屏障就是一个硬件指令,保证程序的可见性、有序性。
synchornized(底层会加锁,表面上是锁上了一段代码):保证代码块的可见性、有序性、原子性

API(就是一些锁和保证线程安全的工具类)
Lock 接口:显式的加锁,解锁,保证代码块的指向的线程安全
ThreadLocal 类,将数据放入到 ThradLocal 中,可以保证多线程下的数据安全

API : 原子类的API ,底层是 Unsafe 类的 CAS 操作,直接操作内存,使用 CPU 的原子指令

Callable 和 Runnable 都是用于创建线程的接口:
区别是:

@FunctionalInterface
public interface Callable<V> {
    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    V call() throws Exception;
}


public interface Runnable {
    /**
     * When an object implementing interface Runnable is used
     * to create a thread, starting the thread causes the object's
     * run method to be called in that separately executing
     * thread.
     * 

* The general contract of the method run is that it may * take any action whatsoever. * * @see java.lang.Thread#run() */ public abstract void run(); }

Callable 的 call 方法是允许有返回值的,run() 方法是没有返回值的
Callable 是一个泛型接口,可以指定返回数据的数据类型
Callable 的 call() 方法是允许抛出异常的,但是 run() 方法是不允许抛出异常的

线程的不正确退出可能导致内存泄露,服务器宕机,影响客户的使用。JVM 中线程存储在栈内存空间中,因为线程就是一个个指令的集合,当然,线程也会使用到 JVM 的堆内存空间保存中间创建出来的对象,也会使用程序计数器保存下一条需要执行的指令。

Java 的线程和 Linux 的线程有什么区别,为什么需要 Java 的线程

1、调度方式不一样,一个是 JVM 调度,一个是 Linux 系统内核调度
2、创建销毁成本不一样, Java 的线程创建销毁的成本是更加高的

需要 Java 线程的原因就是需要使用 Java 线程实现代码的跨平台,JVM 本质上就是运行的一个个 Java 线程组成的,JVM 的可跨平台 Java 线程是有帮助的

volatile 具体实现原理,内存重排序都会发生在哪,为什么要内存重排序

volatile 用于修饰变量,保证多个线程对同一个 volatile 修饰的变量的可见性以及有序性;
实现的核心原理就是在线程读取 volatile 变量之前加一个读屏障,保证读取最新的数据,在写入数据之后加一个写屏障,保证数据被其他线程看到。

内存重排序可能发生在创建对象的时候,创建对象,变量指向内存地址的顺序或许可以发生变化。

内存重排序目的是为了对 Java 代码进行优化,提升代码的运行效率

使用过哪些 Java 并发包

Java 保证线程安全的工具类或者接口而已

原子类
各种锁

简述 BIO,NIO 的具体使用及原理

concurrentHashMap1.8 和之前版本有什么区别,HashMap 的具体实现,红黑树和平衡二叉树的区别,为什么不用 B+ 树
Java 的 GC 整体过程,垃圾收集算法,流程,垃圾收集器,强引用,弱引用,虚引用等概念等,如果我要设置一个内存缓冲区,让垃圾收集器不对其进行操作怎么办
JVM 内存分区,。假设 Java 的 GC 时间过长,简述应该如何做来排查解决这个问题,jamp 的 dump 命令比较重,有什么代替的方法。
代码实现每五分钟一次 Minor GC,如果要 FullGC 呢
ThreadLocal 的具体是怎样的,为什么会有内存泄漏问题,怎样避免
Java 的异常种类有哪些,平时自己是怎么处理异常的
Spring 的 IOC 和 AOP 及 MVC 机制,Sping 中的单例 bean 是否可以依赖多例 bean
Springboot 起步依赖有什么好处,为什么使用 MyBatis 不适用数据库连接池
tomcat 如果有两个项目,两个项目里面如果有相同的 class,那么 tomcat 是如何对其进行区别
简述 MySQL 的 ACID 性质及实现,ACID 有哪些一致性种类,乐观锁怎么实现的,简述 MySQL 的隔离机制及实现,简述 MySQL 索引结构及实现
如果 MySQL 要插入十万条数据,有什么较好的方法
Redis 支持集群的几种方式,redis 的跳表要实现快速查找第 k 小的元素怎么做
Netty 拆包粘包的实质,Netty 线程池中的线程建立连接之后,这条连接是不是始终属于这个请求,对于 Netty 来说是不是只占用服务端的一个套接字,了解 zero copy 嘛
简述 TCP 三次握手四次挥手的状态转移,ip 层的 mtu 是什么,如何探测机器之间的 mtu
进程和线程的区别,进程的通信方式,线程空间中的内容,进程中打开文件其他线程可以直接读写那个文件嘛。用户态和内核态对于读写文件的操作有什么区别
内存为什么分页,虚拟内存有什么用,内存中的脏页是由硬件完成还是软件完成
怎样用单线程实现 2k QPS 对于服务器压测,1 s 均匀发 2 k 条消息,可以异步返回
Nginx 和 Redis 能同时处理很多条请求,万级别,是不是都是通过 Linux 中的 IO 模型的的类似信号的机制.想这样的 C10 K问题,也就是单机 10000 条并发连接应该如何去处理
设计高并发秒杀系统,里面的阻塞队列是如何实现的
在王者荣耀里面,当渲染地图时,考虑网络波动的情况应该怎样渲染地图才能显得不卡,这回导致什么问题
如何实现 cookie 和 session 机制
token 在分布式服务器上的应用,用什么框架来验证 token;除了 redis 还可以怎么做异步框架

你可能感兴趣的:(面试,jvm,java)