显式锁示例

tryLock在一定时间内获取不到锁不会一直阻塞,会返回false,然后线程会继续向下走。

package com.iteye.yuanyuan7891.thread.lock;

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

public class TestLock
{
    
    public static void main(String[] args)
        throws InterruptedException
    {
        new AThread("A").start();
        Thread.sleep(1000);
        new AThread("B").start();
        Thread.sleep(7000);
        new AThread("C").start();
    }
}

/**
 * 示例线程
 */
class AThread extends Thread
{
    public static volatile Lock dbInsertLock = new ReentrantLock();
    
    public static Lock getDbInsertLock()
    {
        return dbInsertLock;
    }
    
    String tName = null;
    
    AThread(String name)
    {
        super(name);
        this.tName = name;
    }
    
    @Override
    public void run()
    {
        try
        {
            System.out.println(tName + "等待锁" + new Date());
            if (dbInsertLock.tryLock(3, TimeUnit.SECONDS))
            {
                // if (dbInsertLock.tryLock(3, TimeUnit.SECONDS)){
                // System.out.println(tName+"可重入"+new Date());
                // }else{
                // System.out.println(tName+"不可重入"+new Date());
                // }
                try
                {
                    System.out.println(tName + "持有锁" + new Date());
                    sleep(6000);
                    System.out.println(tName + "做完了" + new Date());
                }
                finally
                {
                    dbInsertLock.unlock();
                    System.out.println(tName + "释放锁" + new Date());
                }
            }
            else
            {
                System.out.println(tName + "获取不到锁!再见" + new Date());
            }
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        super.run();
    }
}

 

附tryLock方法说明:

boolean tryLock(long time, 
TimeUnit unit) 
throws InterruptedException 
如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁。 
如果锁可用,则此方法将立即返回值 true。如果锁不可用,出于线程调度目的,将禁用当前线程,并且在发生以下三种情况之一前,该线程将一直处于休眠状态:

锁由当前线程获得;或者 
其他某个线程中断当前线程,并且支持对锁获取的中断;或者 
已超过指定的等待时间 
如果获得了锁,则返回值 true。

如果当前线程:

在进入此方法时已经设置了该线程的中断状态;或者 
在获取锁时被中断,并且支持对锁获取的中断, 
则将抛出 InterruptedException,并会清除当前线程的已中断状态。 
如果超过了指定的等待时间,则将返回值 false。如果 time 小于等于 0,该方法将完全不等待。

实现注意事项

在某些实现中可能无法中断锁获取,即使可能,该操作的开销也很大。程序员应该知道可能会发生这种情况。在这种情况下,该实现应该对此进行记录。

相对于普通方法返回而言,实现可能更喜欢响应某个中断,或者报告出现超时情况。

Lock 实现可能可以检测锁的错误用法,例如,某个调用可能导致死锁,在特定的环境中可能抛出(未经检查的)异常。该 Lock 实现必须对环境和异常类型进行记录。

参数: 
time - 等待锁的最长时间 
unit - time 参数的时间单位 
返回: 
如果获得了锁,则返回 true;如果在获取锁前超过了等待时间,则返回 false 
抛出: 
InterruptedException - 如果在获取锁时,当前线程被中断(并且支持对锁获取的中断)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值