【并发】3、LockSupport阻塞与唤醒,相较与wait和notify
我们可以使用wait和notify分别对象线程进行阻塞或者唤醒,但是我们也可以使用LockSupport实现一样的功能,并且在实际使用的时候,个人感觉LockSupport会更加顺手
范例1,wait与notify
class WaitTest1 {
    static class ThreadA extends Thread {
        public ThreadA(String name) {
            super(name);
        }
        @Override
        public void run() {
            synchronized (this) {
                System.out.println(Thread.currentThread().getName() + " wakup others");
                this.notify(); // 唤醒当前线程对象
                for (int i = 0; i < 10; ++i) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("唤醒当前线程对象之后" + i);
                }
            }
            for (int i = 0; i < 10; ++i) {
                System.out.println("唤醒当前线程对象,释放锁之后前" + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("唤醒当前线程对象,释放锁之后" + i);
            }
        }
    }
    public void mian1() {
        ThreadA ta = new ThreadA("ta");
        //因为wait需释放锁,所以必须在synchronized中使用(没有锁定则么可以释放?没有锁时使用会抛出IllegalMonitorStateException(正在等待的对象没有锁))
        synchronized (ta) {
            try {
                System.out.println(Thread.currentThread().getName() + " start ta");
                ta.start();
                System.out.println(Thread.currentThread().getName() + " block");
                // 主线程等待,释放当前线程锁
                ta.wait();
                System.out.println(Thread.currentThread().getName() + " continue");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:

范例2,locksupport
class LockSupportTest1 {
    private static Thread mainThread;
    static class ThreadA extends Thread {
        public ThreadA(String name) {
            super(name);
        }
        @Override
        public void run() {
            synchronized (this) {
                System.out.println(Thread.currentThread().getName() + " wakup others");
//                this.notify(); // 唤醒当前线程对象
                LockSupport.unpark(mainThread);  //this,这里就不能使用this了,如果这里使用this,那么其实并没有释放这个对象的锁,释放的对象是ta的锁,那就会造成死锁
                for (int i = 0; i < 10; ++i) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("唤醒当前线程对象之后" + i);
                }
            }
            for (int i = 0; i < 10; ++i) {
                System.out.println("唤醒当前线程对象,释放锁之后前" + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("唤醒当前线程对象,释放锁之后" + i);
            }
        }
    }
    public void main1() {
        ThreadA ta = new ThreadA("LockSupportTest1");
        //获取当前主线程对象
        mainThread = Thread.currentThread();
        System.out.println(Thread.currentThread().getName() + " start ta");
        ta.start();
        System.out.println(Thread.currentThread().getName()+" block");
        //对主线程进行阻塞
        LockSupport.park(mainThread);
        System.out.println(Thread.currentThread().getName()+" continue");
    }
}

效果展示:

两者相比我们就会发现,
1、locksupport不需要先进入对应的同步锁,也就是synchronize获取当前锁,然后才能使用wait进行释放
2、locksupport不局限在本线程中,更感觉是跳脱在线程外,对线程进行操控,不想synchronize中的notify,在没有退出同步代码块之前,这个锁实际上还是当前线程占用的,不管是否执行了notify
只有在退出了同步代码块,这个锁才会真正的被释放
【并发】3、LockSupport阻塞与唤醒,相较与wait和notify的更多相关文章
- 阻塞和唤醒线程——LockSupport功能简介及原理浅析
		
目录 1.LockSupport功能简介 1.1 使用wait,notify阻塞唤醒线程 1.2 使用LockSupport阻塞唤醒线程 2. LockSupport的其他特色 2.1 可以先唤醒线程 ...
 - 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport
		
在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...
 - Java并发框架——AQS之阻塞与唤醒
		
根据前面的线程阻塞与唤醒小节知道,目前在Java语言层面能实现阻塞唤醒的方式一共有三种:suspend与resume组合.wait与notify组合.park与unpark组合.其中suspend与r ...
 - 多线程之Java线程阻塞与唤醒
		
线程的阻塞和唤醒在多线程并发过程中是一个关键点,当线程数量达到很大的数量级时,并发可能带来很多隐蔽的问题.如何正确暂停一个线程,暂停后又如何在一个要求的时间点恢复,这些都需要仔细考虑的细节.在Java ...
 - 从JDK源码角度看线程的阻塞和唤醒
		
目前在Java语言层面能实现阻塞唤醒的方式一共有三种:suspend与resume组合.wait与notify组合.park与unpark组合.其中suspend与resume因为存在无法解决的竟态问 ...
 - 深入理解Object提供的阻塞和唤醒API
		
深入理解Object提供的阻塞和唤醒API 前提 前段时间花了大量时间去研读JUC中同步器AbstractQueuedSynchronizer的源码实现,再结合很久之前看过的一篇关于Object提供的 ...
 - J.U.C之AQS:阻塞和唤醒线程
		
此篇博客所有源码均来自JDK 1.8 在线程获取同步状态时如果获取失败,则加入CLH同步队列,通过通过自旋的方式不断获取同步状态,但是在自旋的过程中则需要判断当前线程是否需要阻塞,其主要方法在acqu ...
 - Java并发编程:阻塞队列(转载)
		
Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...
 - 【转】Java并发编程:阻塞队列
		
在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList),这些工具都为我们编写多线程程 ...
 
随机推荐
- WebSocket 长连接 及超时问题解决
			
<?phpset_time_limit(0); class SocketService { private $address = 'localhost'; private $port = 80; ...
 - OpenCV+VisualStudion2017配置
			
1.创建工程 Ctrl+Shift+n 2.创建.cpp文件 Ctrl+Shift+a 3.打开属性管理器 视图->其他窗口->属性管理器 Debug64右键 属性 4.添加包含目录 VC ...
 - 假期训练八(poj-2965递归+枚举,hdu-2149,poj-2368巴什博奕)
			
题目一(poj-2965):传送门 思路:递归+枚举,遍历每一种情况,然后找出最小步骤的结果,与poj-1753类似. #include<iostream> #include<cst ...
 - C#中string类型是值类型还是引用类型?(转)
			
出处:https://www.cnblogs.com/dxxzst/p/8488567.html .Net框架程序设计(修订版)中有这样一段描述:String类型直接继承自Object,这使得它成为一 ...
 - Le Chapitre I
			
Lorsque j'avais six ans j'ai vu, une fois, une magnifique image, dans un livre sur la Forêt[fɔrε] Vi ...
 - vba中变量作用域
			
参考:http://club.excelhome.net/thread-1237085-1-1.html 全局变量例子public 变量1 AS IntegerSub LLL()变量1 = 111 ...
 - go语言判断末尾不同的长字符串的方法
			
判断两种末尾不同的长字符串,在使用正则表达式的基础上,进一步利用好字符串的方法,最后成功对问题进行解决. package utils import ( "io/ioutil" &q ...
 - asp.net DataReader DataTable 使用反射给给实体赋值
			
asp.net 使用反射给给实体赋值 实体类继承此基类 using System.Reflection; using System.Data.SqlClient; using System.Data; ...
 - FPGA之初认识
			
什么是FPGA FPGA(Field-Programmable Gate Array),即现场可编程门阵列 .看到编程两个字码农就笑了,不就是编程嘛,那可是我们的强项 .且慢,此编程非彼编程 .一定要 ...
 - 【python-pip】pip安装国外插件timeout解决方案
			
为什么会timeout呢,你懂得(不懂???!!!) 解决方案: 使用国内豆瓣镜像安装(也有其他的镜像,自己可以搜) pip install xxx -i http://pypi.douban.com ...