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