java.util.concurrent.locks
Interfaces and classes providing a framework for locking and waiting for conditions that is distinct from built-in synchronization and monitors.接口和类提供了用于锁定和等待条件的框架,这些条件不同于内置的同步和监视器。
- 使用Lock 中的tryLock方法尝试获得锁(非阻塞形式)
//仅在调用时锁空闲(释放)时才获取锁。
//获取锁(如果有)并立即返回true值。 如果锁不可用,则此方法将立即返回false值。
Lock lock=new ReentrantLock();
//使用tryLock方法尝试获取锁
//tryLock不阻塞(如果获得了锁,则返回为true;否则为false)
if (lock.tryLock()){
//获取锁时 保证能够释放锁,没有获取锁时不会释放锁
try {
System.out.println("对受保护的资源进行操作");
}finally {
lock.unlock();
}
}
- 使用具有超时时间的tryLock方法尝试获得锁
//如果锁在给定的等待时间内是空闲的,并且当前线程尚未中断,则获取该锁
Lock lock = new ReentrantLock();
//使用tryLock方法尝试获取锁
try {
//10秒超时
if (lock.tryLock(10, TimeUnit.SECONDS)) {
//获取锁时 保证能够释放锁,没有获取锁时不会释放锁
try {
System.out.println("对受保护的资源进行操作");
} finally {
lock.unlock();
}
}
} catch (InterruptedException exception) {
System.out.println("尝试获得锁时中断");
}
- 使用lock方法获取锁(阻塞形式)
//获取锁
//如果该锁不可用,则出于线程调度目的,当前线程将被禁用,并处于休眠状态,直到获得该锁为止。
Lock lock = new ReentrantLock();
lock.lock();
try {
System.out.println("修改受保护的资源");
} catch (Exception e) {
//回滚try中的操作或者将受保护的资源改成合适的状态值
e.printStackTrace();
} finally {
lock.unlock();
}
- 使用condition条件来等待和唤醒(生产者和消费者)
final Lock lock = new ReentrantLock();
final Condition customer = lock.newCondition();
final Condition producer = lock.newCondition();
//消息内容
String message = null;
//生产者
public void put(String mes) throws InterruptedException {
lock.lock();
try {
while (message != null) {
producer.await();
}
message = mes;
customer.signal();
} finally {
lock.unlock();
}
}
//消费者
public String take() throws InterruptedException {
lock.lock();
try {
while (message == null) {
customer.await();
}
String res = message;
message = null;
producer.signal();
return res;
} finally {
lock.unlock();
}
}