java方法是否可中断梳理

常见方法的中断相关汇总

调用方法 是否可以中断 是否释放资源(锁) 是否释放cpu
synchronized 不可中断 不释放 释放
lock 不可中断 不释放 释放
tryLock 可以中断 不释放 释放
lockInterruptibly 可以中断 不释放 释放
InterruptibleChannel 可以中断 不释放 释放
Thread.sleep 可以中断 不释放 释放
thread.join() 可以中断 释放thread对象的锁,其他不释放 释放
object.wait() 可以中断 释放 释放
condition.await() 可以中断 释放 释放

其中thread.join底层其实是调用了thread对象的wait方法,之后一般被jvm的notify唤醒。
源码参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public final synchronized void join(long millis) // 方法上有synchronized
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;

if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}

if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay); // 实际调用的是wait,由notify唤醒
now = System.currentTimeMillis() - base;
}
}
}

总结
lock,synchronized容易死锁,因为不可中断。
尽量用表格下方的方法,性能会高些。

内核态

What: 什么是内核态

访问不属于自己的内存(用户空间、虚拟内存地址)时,
需要系统调用,进入cpu特权模式,因此需要切换到内核态;

切换到内核态时是否一定要释放cpu?
只是把寄存器保存到进程内核栈而已,进程cpu并不需要释放;

进程切换、线程切换是否需要切换内核态?
进程切换、线程切换:需要用到内核里的数据结构,因此需要进入内核态;

操作系统线程库

1)POSIX Pthreads:可以作为用户或内核库提供,作为 POSIX 标准的扩展
2)Win32 线程:用于 Window 操作系统的内核级线程库

java的线程库

Java 线程 API 通常采用宿主系统的线程库来实现。
也就是说在 Win 系统上,Java 线程 API 通常采用 Win API 来实现;
在 UNIX 类系统上,采用 Pthread 来实现。

具体到hotpot实现,则JVM线程跟内核轻量级进程一一对应。

推荐文章