“【面试:Java并发】”的版本间差异
跳到导航
跳到搜索
(创建页面,内容为“category:面试 === sleep() 和 wait()、wait(n) 的区别? === # '''sleep()''': 是 '''Thread''' 类的'''静态方法''',当前线程将睡眠 n 毫秒,线程进入阻塞状态。 #* 当睡眠时间到了,会解除阻塞,进行可运行状态,等待 CPU 的到来。 #* sleep 不释放锁(如果有的话); # '''wait()''': 是 '''Object''' 的方法,必须与 '''synchronized''' 关键字一起使用,线程进入阻塞状态。 #*…”) |
无编辑摘要 |
||
第20行: | 第20行: | ||
=== volatile 关键字<ref name="锁"/><ref >参见:[[深入理解JVM:Java内存模型与线程#对于volatile型变量的特殊规则]]</ref> === | === volatile 关键字<ref name="锁"/><ref >参见:[[深入理解JVM:Java内存模型与线程#对于volatile型变量的特殊规则]]</ref> === | ||
== 参考 == | |||
<references /> |
2022年4月1日 (五) 01:18的版本
sleep() 和 wait()、wait(n) 的区别?
- sleep(): 是 Thread 类的静态方法,当前线程将睡眠 n 毫秒,线程进入阻塞状态。
- 当睡眠时间到了,会解除阻塞,进行可运行状态,等待 CPU 的到来。
- sleep 不释放锁(如果有的话);
- wait(): 是 Object 的方法,必须与 synchronized 关键字一起使用,线程进入阻塞状态。
- 当 notify 或者 notifyall 被调用后,会解除阻塞。但是,只有重新占用互斥锁之后才会进入可运行状态。
- wait 会释放互斥锁。
synchronized 关键字[1]
synchronized 底层实现:【monitor 机制】 进入时,执行 monitorenter,将计数器 +1,释放锁 monitorexit 时,计数器-1; 当一个线程判断到计数器为 0 时,则当前锁空闲,可以占用;反之,当前线程进入等待状态。
Synchronized 是在加锁,加对象锁。
- 对象锁是一种重量锁(monitor)。
- 该关键字是一个几种锁的封装。synchronized 的锁机制会根据线程竞争情况在运行时会有偏向锁(单一线程)、轻量锁(多个线程访问 synchronized 区域)、对象锁(重量锁,多个线程存在竞争的情况)、自旋锁等。
volatile 关键字[1][2]
参考
- ↑ 1.0 1.1 参见:锁
- ↑ 参见:深入理解JVM:Java内存模型与线程#对于volatile型变量的特殊规则