线程和过程是什么?
**过程和线程的区别?
什么是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缓存。在多核系统中,当一个等待线程醒来时,它可能会在另一个内核中运行,从而重建缓存。可用于避免重建缓存,减少等待重建的时间。