基础知识点三
35.并行和并发有什么区别?
并行:同时执行任务;并发:同一事件段内执行多个事件
并行发生在不同实体上,并发发生在同一实体上
36.线程和进程的区别?
进程:是并发执行的程序在执行过程中分配和资源管理的基本单元;线程:是进程的一个执行单元,是进程内调度实体,比进程更小的独立运行的基本单元。线程也被称为轻量级进程
37.守护线程是什么?
守护线程,是个服务线程,即是服务其他线程,其他线程只有一种就是用户线程,java线程分2种,1、守护线程,比如垃圾回收线程;2、用户线程,就是应用程序里的自定义线程。
38.创建线程有哪几种方式?
1、继承Thread类,实现run方法;2、通过Runnable接口创建线程类;3、Callable接口和FutureTask类创建线程
39.说一下 runnable 和 callable 有什么区别?
runnable 没有返回结果,callable有返回结果;futureTask的get方法获取callable的返回结果,该方法阻塞
40.线程有哪些状态?
五种状态:新建、就绪(可运行)、运行、阻塞、死亡
41.sleep() 和 wait() 有什么区别?
sleep()正在执行的线程主动让出CPU,不会释放同步资源锁;wait()释放同步资源锁(也就是synchronized所获得的锁),以便正在等待该资源的线程继续运行,只有调用notify方法,才能解除wait状态
42.notify()和 notifyAll()有什么区别?
notify()只随机唤醒一个wait线程;notifyAll()唤醒所有wait线程
43.线程的 run()和 start()有什么区别?
直接调用run()方法的话,仅仅是普通方法的运行,不会创建线程;调用start()方法,会创建线程,运行run()方法体
44.创建线程池有哪几种方式?
通过Executors提供四种线程池,分别为:
1、newCachedThreadPool创建一个可缓存线程池,灵活回收空闲线程,若没有可用线程,创建新的线程;
2、newFixedThreadPool创建可指定长度的线程池,超出的线程会在队列中等待;
3、newScheduledThreadPool创建可指定长度的线程池,支持定时或周期性的任务执行;
4、newSingleThreadExecutor创建单线程的线程池,也就是相当于单线程串行执行所有任务
46.线程池中 submit()和 execute()方法有什么区别?
submit()可以执行有返回值的任务;execute()执行没有返回值的任务
47.在 java 程序中怎么保证多线程的运行安全?
线程安全三个方面体现。
1、原子性,同一时刻只能有一个线程对数据进行操作(synchronized,Lock);
2、可见性,一个线程对主内存修改能及时地被其他线程看到(Volatile,synchronized,Lock);
3、有序性,即程序执行的顺序按照代码的先后顺序执行,java模型中,允许编译器和处理器对指令重排序,重排序不会影响到单线程的执行,却会影响到多线程并发执行的正确性(Volatile,synchronized,Lock);
当在处理并发编程的时候,只要程序满足了原子性,可见性和有序性,那么程序就不会发生脏数据的问题,也就是线程安全。
48.多线程锁的升级原理是什么?
锁从低到高依次为:无状态锁,偏向锁,轻量级锁和重量级锁,这几个状态随着竞争逐渐升级,锁可以升级不能降级
49.什么是死锁?
死锁指由两个或者多个线程相互持有对方所需要的资源,导致这些线程相互等待对方的资源而处于等待状态,无法继续执行
50.怎么防止死锁?
产生死锁条件:
1、互斥,一个资源每次只能被一个进程使用;2、请求与保持,一个进程申请新的资源的同时保持对原有的资源的占有;
3、不可剥夺,资源申请者不能强行从资源占有者的手中夺取,资源只能由占有者自愿释放;4、循环等待,若干进程之间形成一种头尾相连的循环等待资源关。
只要系统发生死锁,上述条件一定成立,只要上述条件之一不满足,就不会发生死锁。
51.ThreadLocal 是什么?有哪些使用场景?
ThreadLocal可以叫做线程本地变量,常用场景:数据库连接,session管理
52.说一下 synchronized 底层实现原理?
synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。
Synchronized进过编译,会在同步块的前后分别形成monitorenter和monitorexit这个两个字节码指令。在执行monitorenter指令时,首先要尝试获取对象锁。如果这个对象没被锁定,或者当前线程已经拥有了那个对象锁,把锁的计算器加1,相应的,在执行monitorexit指令时会将锁计算器就减1,当计算器为0时,锁就被释放了。如果获取对象锁失败,那当前线程就要阻塞,直到对象锁被另一个线程释放为止。
53.synchronized 和 volatile 的区别是什么?
- volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
- volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的
- volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性
- volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
- volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化
54.synchronized 和 Lock 有什么区别?
synchronized 是一个关键字,不可以判断锁的状态,Lock是一个类,可以判断锁的状态;synchronized 线程获取不到锁,一直处于等待状态,Lock尝试获取锁,可以不用等待
55.synchronized 和 ReentrantLock 区别是什么?
这两种方式最大区别就是对于Synchronized来说,它是java语言的关键字,是原生语法层面的互斥,需要jvm实现。而ReentrantLock它是JDK1.5之后提供的API层面的互斥锁,需要lock()和unlock()方法配合try/finally语句块来完成。
56.说一下 atomic 的原理?
当线程写数据的时候,先对内存中要操作的数据保留一份旧值,真正写的时候,比较当前的值是否和旧值相同,如果相同,则进行写操作。如果不同,说明在此期间值已经被修改过,则重新尝试。