栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

多线程之锁

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多线程之锁

我们常用的线程加锁方式synchronized(Object), 他的wait方法会释放锁,也就是当调用 当前线程的wait方式时,别的线程可以获取该锁,sleep()方法不会释放锁,别的线程只能等待该线程释放锁。 与此相类似的还有ReentrantLock, 该对象的调用await()分三步, 1.先获取Condition 对象 private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); 2. 先要获取监视器(即调用lock方法) lock.lock(); 3. 调用await() 方法 condition.await(); 最重要的是该方法会释放锁,也就是会释锁(监视器)给别的线程

public class ReentLock {

    private Lock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();
    private  void lockTest() throws InterruptedException {

        lock.lock();
        System.out.println("等待"+Thread.currentThread().getName());
        condition.await();
        System.out.println("结束");
        lock.unlock();

    }
    private void lockTest1() throws InterruptedException{
        lock.lock();
        Thread.sleep(1000);
        System.out.println("唤醒"+ Thread.currentThread().getName());
        condition.signalAll();
        lock.unlock();
    }
    public static void main(String[] args){
        ReentLock reentLock = new ReentLock();
        new Thread(()->{
            try {
                reentLock.lockTest();
            }catch (InterruptedException e){
                e.printStackTrace();
            }

        },"A").start();
       new Thread(()->{
           try {
               reentLock.lockTest1();
           }catch (InterruptedException e){
               e.printStackTrace();
           }
       },"B").start();
    }
}
也就是说A线程启动了,调用了 condition的await()方法,线程B就可以调用lock的lock()方法。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/592434.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号