Java-java面试-多线程必问

1、什么叫进程?线程?区别是什么?
软件:包含源代码 安装手册 各种用来支撑程序运行时所需要的文件清单的集合

进程:应用程序(软件)执行时被动态加载到内存后,操作系统会给它分配一个唯一的PID,这时我们就说进程就诞生

线程:线程是cpu调度的基本单位

区别:(面试题目)
1、进程是操作系统分配资源(cpu memory disk network)的基本单位
2、线程是cpu调度的基本单位
3、线程是属于某个进程
4、每个线程共享堆空间(进程资源),拥有自己独立的栈空间。

2、多线程执行时,它们顺序是怎么样的?
多线程执行是乱序,多线程执行时的顺序是由cpu的调度机制确定 (cpu轮循,当时间片到时就唤醒一个来执行)
new MyThread().start(); 线程叫t1
new MyThread2().start(); 线程叫t2

//请问以上两行代码在执行时,它们执行的先后顺序?
A. t1先执行 t2后执行
B. t2先执行 t1后执行
C. t1 t2 同时执行
D. t1 t2执行顺序不确定

答案:D
线程调用start()方法(只是告诉cpu我准备就绪了,可以调度了),并不代表它就能马上启动!

3、sleep ? wati ? notify notifyAll? 它们区别是什么? 你对java Object类了解多少?
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
你对Object 了解多少?

1、public final Class<?> getClass() { //重要:反射
return shadow$klass;
}

//取得一个类的对象:
1.1 Stuent stuObj = new Student();
1.2. Class<?> cls = Class.forName(“字符串形式类全名”) ;
Student o = (Student )cls.newInstance(); //创建这个运行时类的Java 对象

2.int hashCode() //只要一个类重写此函数,多线程加锁时,此类就不可偏向
保证访问资源 互斥性
偏向锁
轻量锁
重量锁

锁: 原子性 排它性

native 函数本身它是C++, JNI: java 本地接口调用

//面试题
3.public boolean equals(Object obj) 引用类型的对象比较大小: 最终引用类型class 要实现比较器的接口,并重写equals(),才能真正实现比较
比较器的接口: 还是拿出类的成员变量 根据成员变量的值的大小, 自定义比较规则来完成比较!

简述Comparable和Comparator两个接口的区别: 这个接口在哪个包?
java.lang.Comparable public int compareTo(Object o)
java.util.Comparator public int compare(Object o1, Object o2)

第一种方式:
public class Student implements Comparable{
@Override
public int compareTo(Student o) {
return this.age‐o.age;//升序
}
}

第二种方式:
Student{name=‘rose’, age=18}
Student{name=‘ace’, age=17}
Student{name=‘jack’, age=16}
Student{name=‘abc’, age=16}
Student{name=‘mark’, age=16}
List list = new ArrayList<>();
list.add();

public class Student{
//成员变量
private String name;
private int age;
public Student() { }
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}

Collections.sort(list, new Comparator() {
@Override
public int compare(Student o1, Student o2) {
// 年龄降序
int result = o2.getAge()‐o1.getAge();//年龄降序

            if(result==0){
//第一个规则判断完了 下一个规则 姓名的首字母 升序                     
result = o1.getName().charAt(0)‐o2.getName().charAt(0);                 
}
            return result; 
        }
    });

//最终的比较实现:是要去实现 compare() 或 compareTo(), 按自定义的比较方式去实现比较!!

区别:
3.1、实现方式不一样
Comparable类必须要去实现比较器接口
Comparator接口不需要类去单独实现比较器接口了(建议工作中用此方式去实现比较)
3.2. Comparator更容易在未来对类进行扩展
3.3 它们是完全不同的包,比较方法也不一样
java.lang.Comparable public int compareTo(Object o)
java.util.Comparator public int compare(Object o1, Object o2)

4、public String toString() 输出一个类的实例在堆中的内存地址

//面试题 : Thread.sleep(5000) 与 wait()函数区别?
5、public final native void notify(); //重要:多线程
public final native void notifyAll();
6、 public final void wait() throws InterruptedException //重要:多线程

7、 protected void finalize() //面试题 或 解答题

jvm虚拟机: 1.内存管理 2.GC 垃圾回收

一、java垃圾回收器几个观点: GC 垃圾回收原理机制:
7.1 “对象可以不被垃圾回收” : java的垃圾回收遵循一个特点, 就是能不回收就不会回收.只要程序的内存没有达到即将用完的地步,
对象占用的空间就不会被释放.因为如果程序正常结束了,而且垃圾回收器没有释放申请的内存, 那么随着程序的正常退出,
申请的内存会自动交还给操作系统; 而且垃圾回收本身就需要付出代价, 是有一定开销的, 如果不使用,就不会存在这一部分的开销.

7.2 垃圾回收只能回收内存, 而且只能回收内存中由java创建对象方式(堆)创建的对象所占用的那一部分内存, 无法回收其他资源, 比如文件操作的句柄, 数据库的连接等等.

7.3 垃圾回收不是C++中的析构. 两者不是对应关系, 因为第一点就指出了垃圾回收的发生是不确定的, 而C++中析构函数是由程序员控制(delete) 或者离开器作用域时自动调用发生,
是在确定的时间对对象进行销毁并释放其所占用的内存.

7.4 调用垃圾回收器(GC)不一定保证垃圾回收器的运行

二、finalize()的功能 : 一旦垃圾回收器准备释放对象所占的内存空间, 如果对象覆盖了finalize()并且函数体内不能是空的, 就会首先调用对象的finalize(), 然后在下一次垃圾回收动作发生的时候真正收回对象所占的空间.

三、尽量避免使用finalize():
finalize()不一定会被调用, 因为java的垃圾回收器的特性就决定了它不一定会被调用
就算finalize()函数被调用, 它被调用的时间充满了不确定性, 因为程序中其他线程的优先级远远高于执行finalize()函数线程的优先级。
也许等到finalize()被调用, 数据库的连接池或者文件句柄早就耗尽了.
如果一种未被捕获的异常在使用finalize方法时被抛出,这个异常不会被捕获,finalize方法的终结过程也会终止,造成对象出于破坏的状态。
被破坏的对象又很可能导致部分资源无法被回收, 造成浪费.
finalize()和垃圾回收器的运行本身就要耗费资源, 也许会导致程序的暂时停止.

=====================
java程序基础扎实?
jvm虚机原理 并发编程 源码

java程序----> 运行jvm虚拟机的进度Process–>Thread

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文文鑫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值