1、线程和进程有什么区别?
进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。
不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。
2、如何在Java中实现线程?
继承Thread类
class Handler extends Thread{public void run(){//方法重写}public static void main(String[] args){Thread thread = new Handler();//创建线程对象thread.start();//启动线程}
}
实现Runnable接口
class Handler implements Runnable{public void run(){//方法实现}public static void main(String[] args){Handler handler = new Handler();Thread thread = new Thread(handler);//创建线程对象thread.start();//启动线程}
}
3、Java 关键字volatile 与 synchronized 作用与区别?
1,volatile
它所修饰的变量不保留拷贝,直接访问主内存中的。
在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器)。
为了性能,一个线程会在自己的memory中保持要访问的变量的副本。这样就会出现同一个变 量在某个瞬间,在一个线程的memory中的值可能与另外一个线程memory中的值,或者main memory中的值不一致的情况。
一个变量声明为volatile,就意味着这个变量是随时会被其他线程修改的,因此不能将它cache在线程memory中。
2,synchronized
当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。
二、当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有synchronized(this)同步代码块的访问将被阻塞。
4、线程生命周期?
新建一个线程时,它的状态是New。当我们调用线程的start()方法时,状态被改变为Runnable。线程调度器会为Runnable线程池中的线程分配CPU时间并且将它们的状态改变为Running。其他的线程状态还有Waiting,Blocked 和Dead。
5、死锁?
指多个进程在运行过程中因争夺资源而造成的一种僵局,当处于这种状态时,若无外力作用,它们都将无法再向前推进。
原因可归结为两点:竞争资源、 进程间推进顺序非法
产生死锁的必要条件:
互斥条件:在一段时间内某资源仅为一进程所占用。
请求和保持条件:对已获得的资源保持不放。
不剥夺条件:已获得的资源只能由自己释放。
环路等待条件:存在一个进程--资源的环形链。
6、什么是线程池? 为什么要使用它?
创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。
线程池实现了线程重复利用,节约了时间和资源。
// Java线程池的完整构造函数
public ThreadPoolExecutor(int corePoolSize, // 线程池长期维持的线程数,即使线程处于Idle状态,也不会回收。int maximumPoolSize, // 线程数的上限long keepAliveTime, TimeUnit unit, // 超过corePoolSize的线程的idle时长,// 超过这个时间,多余的线程会被回收。BlockingQueue<Runnable> workQueue, // 任务的排队队列ThreadFactory threadFactory, // 新线程的产生方式RejectedExecutionHandler handler) // 拒绝策略
7、反射?
JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
8、JDK 、 JRE 、JVM有什么区别和联系?
JVM : Java 虚拟机。能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。所以说,jvm 是 Java 能够跨平台的核心。
JRE :Java 运行时环境。包含两个部分,jvm和 Java 的一些基本类库。
JDK :Java 开发工具包。jdk 是整个 Java 开发的核心,它集成了 jre 和一些好用的小工具。
这三者的关系是:一层层的嵌套关系。JDK>JRE>JVM。
9、深拷贝浅拷贝
数据类型分为两种基础类型和引用类型:
基础类型:像Number、String、Boolean等这种为基本类型
引用类型:Object和Array
浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,修改其中任意的值,另一个值会随之变化
深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变。
10、JVM内存分为哪几部分?各个部分的作用是什么?
JVM内存区域分为五个部分,分别是堆,方法区,虚拟机栈,本地方法栈,程序计数器。
1)堆。
堆是Java对象的存储区域,任何用new字段分配的Java对象实例和数组。
2)方法区。
它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据,方法区,从JDK1.8永久代被移除。
3)虚拟机栈。
虚拟机栈中执行每个方法的时候,都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。
4)本地方法栈。
与虚拟机栈发挥的作用相似,相比于虚拟机栈为Java方法服务,本地方法栈为虚拟机使用的Native方法服务,执行每个本地方法的时候,都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。
5)程序计数器。
指示Java虚拟机下一条需要执行的字节码指令。
总:其中方法区和堆被JVM中多个线程共享,比如类的静态常量就被存放在方法区,供类对象之间共享,虚拟机栈,本地方法栈,pc寄存器是每个线程独立拥有的,不会与其他线程共享。
11、为什么会出现4.0-3.6=0.40000001这种现象?
2进制的小数无法精确的表达10进制小数,在计算10进制小数的过程中要先转换为2进制进行计算,这个过程中出现误差。
12、“==”比较的是什么?
“==”两边是对象,比较地址。
“==”两边是基本类型,比较数值。