当前位置: 首页 > 图灵资讯 > 技术篇> Java2023年高级面试题,中级面试题

Java2023年高级面试题,中级面试题

来源:图灵教育
时间:2023-06-14 09:44:52

线程和过程是什么?

**过程和线程的区别?

什么是Treemap?

如何停止正在运行的线程?

Java 在编写多线程序时,你会遵循哪些最佳实践?

Java语言采用什么编码方案?特点是什么?

Java 如何唤醒阻塞线程?

解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。

多线程同步有哪些方法?

什么是自旋

1、不同的线程和过程

线程和过程是什么?

进程

在内存中运行的应用程序。 每个在系统上运行的程序都是一个过程

线程

执行过程中的任务(控制单元), 它负责在程序中独立执行。

一个过程至少有一个线程,一个过程可以运行多个线程,多个线程可以共享数据

过程与线程的区别

1、根本区别:过程是操作系统资源分配的基本单位,线程是处理器任务调度和执行的基本单位

2、老年人和标记复制算法

老年人每次只回收少量物体,所以使用它们 Mark-Compact 算法。

3、什么是Treemap?

1、 TreeMap 通过红黑树实现了key-value的有序集合。

2、 Treemap基于红黑树(Red-Black tree)实现。映射按键的自然顺序排序,或创建映射时提供的 Comparator 具体来说,排序取决于所用的结构方法。

3、 线程非同步TreeMap。

4、如何停止正在运行的线程?

在java中有三种方法可以终止正在运行的线程:

5、Java 在编写多线程序时,你会遵循哪些最佳实践?

我在写Java 并发程序时遵循的一些最佳实践:

6、Java语言采用什么编码方案?特点是什么?

Java语言采用Unicode编码标准,Unicode(标准码),它为每个字符制定了一个唯一的值,因此可以安全地使用任何语言、平台和程序。

7、Java 如何唤醒阻塞线程?

首先 ,wait()、notify() 该方法针对对象,调用任何对象 wait()所有方法都会导致线程堵塞,同时也会释放对象的锁。相应地,调用任何对象 notify()方法将随机解除对象堵塞的线程,但需要重新获得对象的锁,直到获得成功才能执行;

其次,wait、notify 方法必须在 synchronized 块或方法中调用,同步块或方法的锁对象和调用应保证 wait、notify 该方法的对象是相同的,因此在调用中 wait 此前,当前线程已成功获得某个对象的锁并执行 wait 阻塞后,当前线程释放之前获得的对象锁。

8、解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。

一般来说,我们定义基本数据类型的变量、对象的引用以及JVM中的堆栈空间用于函数调用的现场保存;通过new关键字和结构创建的对象放置在堆垛空间中。堆垛是垃圾收集器管理的主要区域。由于目前的垃圾收集器采用分代收集算法,堆垛空间也可细分为新一代和旧一代,具体点可分为Edenn、Survivor(也可分为From Survivor和To Survivor)、Tenured;各线程共享的内存区域为方法区和堆,用于存储JVM加载的类信息、常量、静态变量、JIT编译器编译的代码等数据;程序中的字面量(literal)比如直接写的100、”hello常量池是常量池的一部分,常量池是方法区的一部分。堆栈空间操作最快,但堆栈很小。通常,大量物体被放置在堆叠空间中。堆栈和堆叠的大小可以通过JVM的启动参数进行调整。当堆栈空间耗尽时,会导致Stackoverfloweror,而堆叠和常量池空间不足会导致Outofmemoryeror。

String str = new String("hello");

变量str放在堆栈上,用new创建的字符串对象放在堆栈上,而“hello“这个字面量放在方法区。

补充1:

Java(Java)的新版本 在6的一个更新开始)中,由于JIT编译器的发展和“逃逸分析”技术的逐渐成熟,栈上分配、标量替换等优化技术使得对象一定要分配到堆上,变得不那么绝对。

补充2:

运行时,常量池相当于Class文件常量池的动态性。Java语言不要求常量只能在编译期间产生,新常量也可以在运行期间放入池中。Stringintern()的方法是这样的。

看看下面代码的执行结果,比较Java 7之前和之后的操作结果是否一致。

String s1 = new StringBuilder("go") .append("od").toString();System.out.println(s1.intern() == s1);String s2 = new StringBuilder("ja") .append("va").toString();System.out.println(s2.intern() == s2);

9、多线程同步有哪些方法?

Synchronized关键词,Lock锁实现,分布式锁等。

10、什么是自旋

很多 synchronized 里面的代码只是一些非常简单的代码,执行时间非常快。此时,等待的线程可能不值得锁定,因为线程阻塞涉及用户状态和核心状态切换。既然 synchronized 里面的代码执行得很快,所以等待锁的线程不应该被堵塞,而应该被堵塞 synchronized 边界忙于循环,这就是自旋。若多次循环发现未获得锁,再次堵塞,则可能是较好的策略。

忙循环:程序员用循环等待线程,不像传统方法wait(), sleep() 或 yield() 他们都放弃了CPU控制,忙碌的循环不会放弃CPU,它正在运行一个空循环。这样做的目的是保留CPU缓存。在多核系统中,当一个等待线程醒来时,它可能会在另一个内核中运行,从而重建缓存。可用于避免重建缓存,减少等待重建的时间。