常见方法的中断相关汇总
调用方法 | 是否可以中断 | 是否释放资源(锁) | 是否释放cpu |
---|---|---|---|
synchronized |
不可中断 | 不释放 | 释放 |
lock |
不可中断 | 不释放 | 释放 |
tryLock |
可以中断 | 不释放 | 释放 |
lockInterruptibly |
可以中断 | 不释放 | 释放 |
InterruptibleChannel |
可以中断 | 不释放 | 释放 |
Thread.sleep |
可以中断 | 不释放 | 释放 |
thread.join() |
可以中断 | 释放thread对象的锁,其他不释放 | 释放 |
object.wait() |
可以中断 | 释放 | 释放 |
condition.await() |
可以中断 | 释放 | 释放 |
其中thread.join
底层其实是调用了thread对象的wait
方法,之后一般被jvm的notify
唤醒。
源码参考:
1 | public final synchronized void join(long millis) // 方法上有synchronized |
总结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线程跟内核轻量级进程一一对应。