多线程面试题
1,线程与进程的区别
进程是所有线程的集合,每一个线程是进程中的一条执行路径。多线程的好处提高程序的效率
2,实现多线程的方式
继承Thread类,实现Runnable接口,使用匿名内部类实现,重写run方法。
3,使用继承Thread类还是使用实现Runnable接口好
使用实现实现Runnable接口好,原因实现了接口还可以继续继承,继承了类不能再继承,避免了单继承的局限性,实现Runnable接口的方式,更加符合面向对象编程思想,线程分两个部分,一部分是线程对象,一部分是线程任务。继承Thread类,线程的对象和线程任务就耦合在一起了,创建一个线程,既有线程对象,又有线程任务。实现Runnable接口,将线程任务跟对象解耦
4,多线程运行状态
新建,就绪,等待,运行,死亡五个状态
5,什么是多线程安全
当多个线程同时共享,同一个全局变量或者静态变量时,做写的操作,可能会发生数据数据冲突问题,也就是线程安全问题。做读的操作时则不会发生。
6,如何解决多线程之间线程安全问题
使多线之间同步或者使用锁(lock)
7,为什么使用线程同步或使用锁能解决线程安全问题
将可能会发生数据冲突的逻辑代码(线程不安全问题),只能让当前一个线程进行执行,被包裹的代码被当前线程执行完毕,并释放锁之后,才能让其他线程进行执行,这样的话就可以解决线程不安全问题
8,什么是多线程之间同步
当多个线程共享同一个资源,不会受到其他线程的干扰
9,什么是同步代码块
就是将可能会发生线程安全问题的代码,给使用synchronized关键字给包裹起来,只能让当前一个线程进行执行,被包裹的代码执行完成之后才能释放锁,才能让其他线程进行执行
10,同步代码块与同步函数的区别
1),同步代码块可以绑定任意对象,而同步函数只能绑定该类对象this,static同步函数只能绑定字节码类名.class
2),如果多个线程使用同一个锁的话,那么两者均可以使用,如果存在多个锁的话,只能使用同步代码块
11,什么是多线程死锁
多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些线程都无法继续执行
12,wait与sleep区别
1) wait()方法属于Object类中的方法,sleep()方法属于Thread类中的方法
2) sleep()方法是使程序暂停执行指定的时间,让出cpu给其他线程,他的监控状态依然保持,不释放对象锁,当指定时间到了以后自动恢复运行状态
wait()方法,线程会放弃对象锁,进入等待对象锁的等待锁定池中,只有只针对该线程调用notify()方法后,该线程才进入准备就绪状态,获取对象锁,进入运行状态
13,Lock 接口与 synchronized 关键字的区别
Lock 接口可以尝试非阻塞地获取锁,如果某一时刻锁没有被其他线程获取到,则成功获取并持有锁
Lock接口能被中断地获取锁 与synchronized不同,获取到锁的线程能够响应中断,当获取到的锁的线程被中断时,中断异常将会被抛出,同时锁会被释放
Lock接口在指定的截指时间之前获取,如果截至时间到了依旧无法获取,则返回

14,线程的特性
原子性,有序性,可见性
原子性:一个操作或者多个操作,要么全部执行,并且执行的过程不会被任何因素打断,要么就都不执行。
可见性:当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看到修改的值。
有序性:程序执行的顺序按照代码的先后顺序执行(出于代码优化,提高程序运行效率,不能保证程序中各语句的执行顺序同代码中顺序一致,但是他会保证程序最终执行结果和代码顺序执行的结果是一致的)
15,java内存模型
java的内存模型简称:JMM.JMM决定了一个线程对共享变量的写入时,能对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地村春中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在,它涵盖了缓存,写缓存区,寄存器以及其他的而硬件和编译器优化
简单理解:主内存与本地内存的关系
16,多线程通讯存在的线程安全问题(从java的内存模型表述)
java内存模型,定义了一个线程对另一个线程可见。共享变量存放在主内存中,每个线程都有自己的本地内存,当多个线程同时访问同一个数据时,可能本地内存数据没有及时更新到主内存,所以就会发成线程安全
17,什么是Volatile
volatile关键字的作用时变量在多个线程之间可见,每次强制线程每次读取数据都在“主内存"中取值
18,volatile与synchronized区别
仅靠volatile不能保证线程的安全性。(非原子性)
1)volatile轻量级,只能修饰变量。synchronzied重量级,还可以修饰方法
2)volatile只能保证数据的可见性,不能用来同步,因为多个线程并发访问volatie修饰的变量不会阻塞。synchronized不仅保证可见性,而且还保证原子性,因为,只有获得了锁的线程才能进入临界区,从而保证临界区的所有语句都全部执行。多个线程争抢synchronized锁对象,会出现阻塞
19,线程池作用
1,线程池改进了一个应用程序的响应时间,由于线程池中的线程已经准备好且等待被分配任务,应用程序可以直接拿来使用而不用新建一个线程
2,线程池节省了CLR(公共语言运行库 (common language runtime,CLR))为每个短生存周期任务创建一个完整的线程的开销并可以在任务完成时收回资源
3,线程池根据当前在系统中运行的进程来优化时间片
4,线程池允许我们开启多个任务而不用为每个线程设置属性
20,线程池四种创建方式
newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活收回线程,若无可回收,则新建线程
newFixedThreadPool 创建一个定长的线程池,可控制线程池最大并发数,超出的线程会在队列中等待
newScheduledThreadPool 创建一个定时的线程池,支持定时及周期性任务执行
newSingleThreadExecutor 常见一个单线程的线程池,他只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行

浙公网安备 33010602011771号