目录
2.LockSupport的park-unpark与Object的wait-notitfy的对比
1.概述
- 当我要分析AQS,Condition的时候,发现它们当中都使用到了LockSupport,所以先在这里对LockSupport进行学习
- LockSupport是一个工具类,主要作用是挂起和唤醒线程(park-unpark),它是创建锁和其他同步类的基础。
2.LockSupport的park-unpark与Object的wait-notitfy的对比
在没有LockSupport之前,线程的挂起和唤醒咱们都是通过Object的wait和notify/notifyAll方法实现。
wait-notify代码案例1:
package LockSupport;
public class TestObjWait {
public static void main(String[] args)throws Exception {
final Object obj = new Object();
new Thread(new Runnable() {
@Override
public void run() {
int sum = 0;
for(int i=0;i<10;i++){
sum+=i;
}
try {
obj.wait();
}catch (Exception e){
e.printStackTrace();
}
System.out.println(sum);
}
}).start();
//睡眠一秒钟,保证线程A已经计算完成,阻塞在wait方法
Thread.sleep(1000);
obj.notify();
}
}
- wait和notify底层是基于ObjectMonitor的,而ObjectMonitor只有在使用了synchronized时才能获取,即只有synchronized修饰的代码块或者方法中才能使用wait和notify,所以上述出现java.lang.IllegalMonitorStateException
- 所以对于上述的改进,我们只需要加入synchronized修饰即可
wait-notify代码案例1改进:
package LockSupport;
public class TestObjWait {
public static void main(String[] args)throws Exception {
final Object obj = new Object();
new Thread(new Runnable() {
@Override
public void run() {
int sum = 0;
for(int i=0;i<10;i++){
sum+=i;
}
try {
synchronized (obj){
obj.wait();
}
}catch (Exception e){
e.printStackTrace();
}
System.out.println(sum);
}
}).start();
//睡眠一秒钟,保证线程A已经计算完成,阻塞在wait方法
Thread.sleep(1000);
synchronized (obj){
obj.notify();
}
}
}
当我们换成LockSupport的park和unpark后,如下
park-unpark代码案例1:
package LockSupport;
import java.util.concurrent.locks.LockSupport;
public class TestLockSupport {
public static void main(String[] args)throws Exception {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
int sum = 0;
for(int i=0;i<10;i++){
sum+=i;
}
try {
//注意:LockSupport中所有的方法都是static的,所以直接使用类来调用即可
LockSupport.park();
}catch (Exception e){
e.printStackTrace();