java面试准备12

进程程的生命周期,什么时候会出现僵死进程?

僵死进程是指子进程退出时,父进程并未对其发出SIGCHLD信号进行适当处理,导致子进程停留在僵死状态等待父进程为其收尸,这个状态下的子进程就是僵死进程。

说说线程安全问题,什么是线程安全,如何实现线程安全

线程安全:如果线程执行过程中不会产生共享资源的冲突,则线程安全
线程不安全:如果多个线程同时操作主内存的变量,则线程不安全

什么是多线程的安全性

Java的内存模型中有主内存和线程的工作内存之分,主内存上存放的是线程共享的变量(实例字段、静态字段和构成数组的元素),线程的工作内存时线程私有的空间,存放的是线程私有的变量(方法参数和局部变量)。线程在工作时如果要操作主内存的共享变量,为了获得更好地执行性能并不是去直接修改主内存而是会线程私有的工作内存中创建一份变量的拷贝(缓存),在工作内存上对其进行修改后再把修改的值刷会到主内存中去。

可重入锁和不可重入锁

可重入锁指的是可重复可递归调用的锁,在外层使用锁后,在内层依然可以使用,并且不发生死锁,这样的锁就叫作可重入锁。与可重入锁相反,不可重入锁不可递归调用,递归调用就会发生死锁。

互斥同步锁(悲观锁)

(1)Synchorized
(2)ReentranLock
互斥同步锁也叫作阻塞同步锁,特征是对没有获取到锁的线程进行阻塞。
互斥就是非你即我,同步就是顺序访问。互斥同步锁就是以互斥的手段达到顺序访问的目的。操作系统提供了很多互斥机制,比如信号量、互斥量,临界区资源等来控制同一时刻只能有一个或者一组线程访问同一个资源。

非阻塞同步锁

非阻塞同步锁也叫乐观锁,相比于悲观锁来说,它会先进行资源在工作内存中的更新,然后根据主存中的旧值的对比来确定在此期间是否有其他线程对共享资源进行了更新,如果旧值与期望值相同,就表示没有更新,可以把新值写回内存,否则就一直重试到成功。

非阻塞锁是不可重入的,否则会造成死锁。

无同步方案

(1)可重入代码
在执行的任何时刻都可以中断-重入执行而不会产生冲突。特点是不会依赖堆上的共享资源。
(2)ThreadLocal/Volaitile
线程本地的变量,每个线程获取一份共享变量的拷贝,单独进行处理。
(3)线程本地存储
如果一个共享资源一定要被多线程共享,可以尽量让一个线程完成所有的处理操作,比如生产者消费者模式中,一般会让一个消费者完成对队列上资源的消费。

线程池工作原理

(1)当线程池中线程数量小于corePoolSize则会创建线程,并处理请求。
(2)不符合1时,判断workQueue是否已满,若未满则放入工作队列,随着线程池中的核心线程不断执行任务,只要有空闲的工作线程,线程池就会从工作队列中取任务并且去执行。
(3)若工作队列存满,则判断线程池中工作线程数目是否达到最大线程数,未达到则直接创建工作线程执行任务,否则使用对应的策略执行。

Java并发和并行

并发:是指两个或者多个事件在同一时间间隔内发生,在一台处理器上“同时”处理多个任务。
并行:是指两个或者多个事件在同一时刻发生,在多台处理器上同时处理多个任务。

怎么提高并发量,列举你所知道的方案?

(1)HTML静态化
效率最高、消耗最小的就是纯静态化的html页面。
(2)图片服务器分离
图片是最消耗资源的,我们有必要将图片与页面进行分离,这是基本上大型网站都会采用的策略,他们都有独立的、甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因为图片问题而崩溃。
(3)数据库集群、库表散列
数据库集群由于在架构、成本、扩张性方面都会收到所采用DB类型的限制,于是我们需要从应用程序的角度来考虑改善系统架构,库表散列是常用并且有效的解决方案。
我们在应用程序中安装业务和应用或者功能模块将数据库进行分离,不同的模块对应不同的数据库或者表,再按照一定的策略对某个页面或者功能进行更小的数据库散列。
(4)缓存
(5)镜像
竟像是大型网站采用的提高性能和数据安全性的方式,镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异。
(6)负载均衡
负载均衡是大型网站解决高负荷访问和大量并发请求采用的高端解决办法。

你可能感兴趣的:(java,面试,jvm)