Java面试题(三)Java基础-多线程

35.并行和并发有什么区别?

并发是指两个或多个线程在同一时间间隔内发生

并行是指两个或多个线程在同一时刻发生

36.线程和进程的区别?

进程包括线程,一个进程中包含一个或多个线程

进程是在内存中运行的应用程序

线程是在进程中的一个控制单元

37.守护线程是什么?

守护线程是在没有用户线程可服务时会自动离开,这个线程具有最低的优先级,用于为系统中的其它对象和线程提供服务

将一个用户线程设置为守护线程的方式是在线程对象创建之前调用线程对象的setDaemon方法。典型的守护线程例子是JVM中的系统资源自动回收线程,我们所熟悉的Java垃圾回收线程就是一个典型的守护线程

38.创建线程有哪几种方式?

1、继承Thread类

2、实现Runnable接口

3、实现Callable接口

4、创建线程池

39.说一下 runnable 和 callable 有什么区别?

1、callable接口的任务线程可以返回执行结果,runnable接口的任务线程无法没有返回值

2、callable实现类中的call()方法允许向上抛出异常,也可以直接在内部处理,runnable实现类中的run()异常必须在内部处理掉

40.线程有哪些状态?

新建状态 运行状态 阻塞状态 无限等待状态 超时等待状态  终止状态

41.sleep() 和 wait() 有什么区别?

1、sleep不释放锁  wait释放锁

2、sleep定义在Thread类中  wait定义在Object类中

3、sleep可以使用在任何代码块  wait必须在同步方法或同步代码块中使用

42.notify()和 notifyAll()有什么区别?

notify()只会随机唤醒一个等待中的线程

notifyAll()会唤醒等待队列中的所有线程

43.线程的 run()和 start()有什么区别?

start() 是用来启动线程的 轮到该线程执行时 会自动调用该线程的run(),直接调用run() 无法达到多线程的目的,相当于主线程执行Thread对象的run方法

44.创建线程池有哪几种方式

1、    newCachedThreadPool 创建一个可缓存的线程池,如果线程池长度超过处理需求,可灵活回收空闲线程,若无可回收,则新建线程

2、newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待

3、newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行

4、newSingleThreadExecutor 创建一个单线程化的线程池,它只会唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行

5、newWorkStealingPool(int parallelism),这是一个经常被人忽略的线程池,Java 8 才加入这个创建方法,其内部会构建ForkJoinPool,利用Work-Stealing算法,并行地处理任务,不保证处理顺序

45.线程池都有哪些状态

1、RUNNING:这是最正常的状态,接受新的任务

2、SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务。调用线程池的shutdown()方法时,线程池由RUNNING -> SHUTDOWN。

3、STOP:不接受新的任务提交,不再处理等待的队列中的任务,终端正在执行任务的线程。调用线程池的shutdownNow()方法时,线程池由(RUNNING or SHUTDOWN ) -> STOP。

4、TIDYING:所有的任务都销毁了,workCount 为 0,线程池的状态在转换为 TIDYING 状态时,会执行钩子方法 terminated()

当线程池在STOP状态下,线程池中执行的任务为空时,就会由STOP -> TIDYING。

当线程池在SHUTDOWN状态下,阻塞队列为空并且线程池中执行的任务也为空时,就会由 SHUTDOWN -> TIDYING。

5、TERMINATED:线程池处在TIDYING状态时,执行完terminated()之后,就会由 TIDYING -> TERMINATED

46.线程池中 submit()和 execute()方法有什么区别?

execute只支持Runnable 没有返回值

submit支持所有 可以返回持有计算结果的Future对象

47.在 java 程序中怎么保证多线程的运行安全?

线程的安全性问题体现在:

  • 原子性:一个或者多个操作在 CPU 执行的过程中不被中断的特性
  • 可见性:一个线程对共享变量的修改,另外一个线程能够立刻看到
  • 有序性:程序执行的顺序按照代码的先后顺序执行

导致原因:

  • 缓存导致的可见性问题
  • 线程切换带来的原子性问题
  • 编译优化带来的有序性问题

解决办法:

  • JDK Atomic开头的原子类、synchronized、LOCK,可以解决原子性问题
  • synchronized、volatile、LOCK,可以解决可见性问题
  • Happens-Before 规则可以解决有序性问题

48.多线程锁的升级原理是什么?

JVM优化synchronized的运行机制,当JVM检测到不同的竞争状态时,就会根据需要自动切换到合适的锁,这种切换就是锁的升级。升级是不可逆的,也就是说只能从低到高,也就是偏向-->轻量级-->重量级,不能够降级

49.什么是死锁?

在两个或多个线程中,如果每个线程占用了其他线程试图调用的资源,此时会造成这些线程永久阻塞,从而出现死锁

例如:线程A 占用了对象1 去调用对象2,线程B 占用了对象2 去调用对象1,就导致了死锁

50.怎么防止死锁?

  1. 加锁顺序
  2. 加锁限时
  3. 死锁检测

51.ThreadLocal 是什么?有哪些使用场景?

ThreadLocal是线程本地存储

经典的使用场景是为每个线程分配一个 JDBC 连接 Connection,在每个线程中都创建了一个 ThreadLocalMap 对象,每个线程可以访问自己内部 ThreadLocalMap 对象内的 value

这样就可以保证每个线程的都在各自的 Connection 上进行数据库的操作,不会出现 A 线程关了 B线程正在使用的 Connection

52.说一下 synchronized 底层实现原理?

  • 同步代码块是通过 monitorenter 和 monitorexit 指令获取线程的执行权
  • 同步方法通过加 ACC_SYNCHRONIZED 标识实现线程的执行权的控制

53.synchronized 和 volatile 的区别是什么?

54.synchronized 和 Lock 有什么区别?

55.synchronized 和 ReentrantLock 区别是什么?

56.说一下 atomic 的原理?
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值