一、线程休眠

1.1 sleep 和 wait 的区别

2020 9月12日 网易 Java 校招

方法 sleep() wait()
所属类不同 .sleep() 是 Thread 类中的方法 wait()是 Object类的方法
时间不同 sleep() 必须指定时间 wait() 可以指定时间也可以不指定时间
释放锁不同 sleep() 释放 CPU 执行权不释放同步锁 wait() 释放 CPU 执行权也释放同步锁
使用地方不同 sleep() 可以在任意地方使用 wait() 只能在同步代码方法或者同步代码块中使用
捕获异常 sleep() 必须捕获异常 wait() 是 Object 方法,调用需要捕获/ 抛出异常

二、Java 多线程

2.1 对 Java 多线程的描述如下

  1. start 是开启线程,run 是线程的执行体,run 是线程的执行的入口
  2. CyclicBarrier和CountDownLatch都可以让一组线程等待其他线程。前者是让一组线程相互等待到某一个状态再执行。后者是一个线程等待其他线程结束再执行。
  3. Callable中的call比Runnable中的run厉害就厉害在有返回值和可以抛出异常。同时这个返回值和线程池一起用的时候可以返回一个异步对象Future。
  4. start是把线程从new变成了runnable

三、锁

3.1 synchronized 修饰的范围

  1. 修饰的是非静态方法,锁的是 this 对象
  2. 修饰静态方法,锁的是 class 对象
  1. public class Test {
  2. // 锁住的是 this
  3. private synchronized void a() {
  4. }
  5. // 锁住的是 this
  6. private void b() {
  7. synchronized (this) {
  8. }
  9. }
  10. // 锁住的是 class
  11. private synchronized static void c() {
  12. }
  13. // 锁住的是 this
  14. private void d() {
  15. synchronized (Test.class) {
  16. }
  17. }
  18. }
  • abd 修饰的是一样的
  • c 修饰的是 class

    四、用户线程

    4.1 CMS垃圾回收器

    CMS垃圾回收器在那些阶段是没用用户线程参与的

用户线程(user-level threads)指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。
CMS的GC过程有6个阶段(4个并发,2个暂停其它应用程序)

  1. 初次标记(STW initial mark)
  2. 并发标记(Concurrent marking)
  3. 并发可中断预清理(Concurrent precleaning)
  4. 最终重新标记(STW remark)
  5. 并发清理(Concurrent sweeping)
  6. 并发重置(Concurrent reset)
    在初次标记,重新标志的时候,要求我们暂停其它应用程序,那么这两个阶段用户线程是不会参与的