一、线程休眠
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 多线程的描述如下
- start 是开启线程,run 是线程的执行体,run 是线程的执行的入口
- CyclicBarrier和CountDownLatch都可以让一组线程等待其他线程。前者是让一组线程相互等待到某一个状态再执行。后者是一个线程等待其他线程结束再执行。
- Callable中的call比Runnable中的run厉害就厉害在有返回值和可以抛出异常。同时这个返回值和线程池一起用的时候可以返回一个异步对象Future。
- start是把线程从new变成了runnable
三、锁
3.1 synchronized
修饰的范围
- 修饰的是非静态方法,锁的是 this 对象
- 修饰静态方法,锁的是 class 对象
public class Test {
// 锁住的是 this
private synchronized void a() {
}
// 锁住的是 this
private void b() {
synchronized (this) {
}
}
// 锁住的是 class
private synchronized static void c() {
}
// 锁住的是 this
private void d() {
synchronized (Test.class) {
}
}
}
用户线程(user-level threads)指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。
CMS的GC过程有6个阶段(4个并发,2个暂停其它应用程序)
- 初次标记(STW initial mark)
- 并发标记(Concurrent marking)
- 并发可中断预清理(Concurrent precleaning)
- 最终重新标记(STW remark)
- 并发清理(Concurrent sweeping)
- 并发重置(Concurrent reset)
在初次标记,重新标志的时候,要求我们暂停其它应用程序,那么这两个阶段用户线程是不会参与的