Java重入锁

看好了,我只表演一次

/**
 * 重入锁的好搭档:Condition条件
 * 如果大家理解了Object.wait()和Object.notify()方法的话,就能很容易地理解Condition对象了。
 * 它和wait()和notify()方法的作用是大致相同的。但是wait()方法和notify()方法是和synchronized关键字合作使用的,
 * 而Condtion是与重入锁相关联的。
 * 通过Lock接口(重入锁就实现了这个接口)的Condtion newCondition()方法可以生成一个与当前重入锁绑定的Condition实例。
 * 利用Condition对象,我们就可以让线程在合适的时间等待,或者在某一个特定的时刻得到通知,继续执行。
 *
 * Condition接口提供的基本方法如下:
 *
 * void await() throws InterruptedException;
 * void awaitUninterruptibly();
 * long awaitNanos(long nanosTimeout) throws InterruptedException;
 * boolean await(long time, TimeUnit unit) throws InterruptedException;
 * boolean awaitUntil(Date deadline) throws InterruptedException;
 * void signal();
 * void signalAll();
 *
 * 以上方法含义如下
 *
 *     await()方法会使当前线程等待,同时释放当前锁,当其他线程中使用signal()或者signalAll()方法时候,
 *     线程会重新获得锁并继续执行。或者当线程被中断时,也能跳出等待。这和Object.wait()方法很相似。
 *     awaitUninterruptibly()和await()方法类似,但它不会再等待过程中响应中断。
 *     singal() 用于唤醒一个等待队列中的线程。singalAll()是唤醒所有等待线程。
 */
public class ConditionExample implements Runnable{
    public static ReentrantLock lock = new ReentrantLock();
    public static Condition condition = lock.newCondition();


    @Override
    public void run() {

        try {
            lock.lock();
            System.out.println(Thread.currentThread().getName() + " 获取到锁...");
            //等待
            condition.await();
            System.out.println(Thread.currentThread().getName() + " 执行完成");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            //释放锁
            lock.unlock();
            System.out.println(Thread.currentThread().getName() + " 释放锁");
        }


    }

    public static void main(String[] a) throws InterruptedException {
        ConditionExample re = new ConditionExample();
        Thread t1 = new Thread(re,"1 号线程 ");
        t1.start();
        //主线程sleep,1号线程会一直等待.直到获取到1号线程的锁资源,并将其唤醒.
        Thread.sleep(2000);
        //获得锁
        lock.lock();
        //唤醒前必须获得当前资源对象的锁
        condition.signal();
        //释放锁
        lock.unlock();

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值