前言
LockSupport类提供了较低级别的阻塞和解除阻止支持,这对于那些实现自己的自定义锁类的开发人员非常有用。一、LockSupport是什么?
LockSupport 用于创建锁和其他同步类的基本线程阻塞原语。。
二、使用步骤
1.简单介绍
LockSupport通过许可(permit)实现线程挂起、挂起线程唤醒功能。permit可以理解为每个已启动线程维持的一个int类型状态位counter。线程分别通过执行LockSupport静态方法park()、unPark()方法来完成挂起、唤醒操作。
Locksupport 是 线程等待唤醒机制(wait/notify)的改良加强版
2.简单使用
public static void LockSupportHello(){
/**
* 不需要在 同步代码块中 同时也不需要 先等待再唤醒
*/
Thread a = new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-----开始了");
LockSupport.park();
System.out.println(Thread.currentThread().getName()+"-----唤醒了");
});
a.start();
Thread b = new Thread(() -> {
LockSupport.unpark(a);
System.out.println(Thread.currentThread().getName()+"-----继续回来了");
});
b.start();
}
得到的结果就是 线程正常执行
Thread-1-----继续回来了
Thread-0-----开始了
Thread-0-----唤醒了
3.Locksupport 之前使用Syschronized 以及ReentrantLock
Syschronized 使用
public static void synchronizedHello(){
/**
* 必须 放在同步代码块中,并且必须先等待再唤醒
*/
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o){
System.out.println(Thread.currentThread().getName()+"-----开始了");
try {
o.wait();
System.out.println(Thread.currentThread().getName()+"-----继续回来了");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"a").start();
new Thread(()->{
synchronized (o){
o.notify();
System.out.println(Thread.currentThread().getName()+"-----唤醒了");
}
},"b").start();
}
结果:去掉synchronized 同步代码块之后报出异常 java.lang.IllegalMonitorStateException
Exception in thread "a" Exception in thread "b" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at AQS.support.LockSopportOldNew.lambda$synchronizedHello$0(LockSopportOldNew.java:23)
at java.lang.Thread.run(Thread.java:748)
java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at AQS.support.LockSopportOldNew.lambda$synchronizedHello$1(LockSopportOldNew.java:32)
at java.lang.Thread.run(Thread.java:748)
先等待再唤醒结果是:
b-----唤醒了
a-----开始了
线程阻塞
ReentrantLock使用
public static void LockHello(){
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.lock();
try {
System.out.println(Thread.currentThread().getName()+"-----开始了");
condition.await();
System.out.println(Thread.currentThread().getName()+"-----唤醒了");
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
},"a").start();
new Thread(()->{
lock.lock();
try {
System.out.println(Thread.currentThread().getName()+"-----继续回来了");
condition.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
},"b").start();
}
这里就不给大家一一展示了,感兴趣的小伙伴可以自己去看一下结果。
总结
提示:本篇文章主要讲解了LockSupport的基本使用,以及在LockSupport出来之前 Syschronized 以及ReentrantLock 的使用和缺点。小编会持续更新,谢谢大家的支持!

170万+

被折叠的 条评论
为什么被折叠?



