java lock 锁

需要手动释放锁

boolean   lock.tryLock(long time, TimeUtil util);  尝试申请锁并持续 time , 申请到返回 true

void lock.lockInterruptibly() throws InterruptedException;  持续申请锁,效果等同与lock.lock(),但是lockInterruptibly() 可以在主线程取消等待,取消等待后会抛出异常。

package com.iweb;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Created by zh on 2019/4/29.
 */
public class Rep {


    Lock lock = new ReentrantLock();
    volatile boolean stop = false;


    // 通过 lock 申请锁
    private void t1() {
        lock.lock();
        try {
            while(!stop) {
                TimeUnit.SECONDS.sleep(1);
                System.out.println(Thread.currentThread().getName());
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
    
   // 通过 lockInterruptibly 申请锁
    private void t2() {
        boolean l = false;
        try {
            lock.lockInterruptibly();
            l = true;
            while(!stop) {
                TimeUnit.SECONDS.sleep(1);
                System.out.println(Thread.currentThread().getName());
            }
            System.out.println(Thread.currentThread().getName() + " end");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            if (l)
                lock.unlock();
        }
    }

    
    
    public static void main(String[] args) {
        Rep r = new Rep();

        Thread t1 = new Thread(()->r.t1(), "t1");
        t1.start();


        Thread t2 = new Thread(()->r.t2(), "t2");
        t2.start();
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        t2.interrupt(); // 停止t2持续申请但 会抛异常
        r.stop = true; 
    }

}

运行结果 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值