标签:
public class Widget{
public synchronized void doSomething(){
...
}
}
public class LoggingWidget extends Widget{
public sychronized void doSomething{
super.doSomething();
}
}
public interface Lock{
void lock();
void lockInterruptily() throws InterruptedException;
boolean tryLock();
boolean tryLock(long time,TimeUnt unit) throws InterruptedException;
void unlock();
Condition newCondition();
}
/**
其中前面4 个方法都是用来获取锁的,unLock()方法是用来释放锁的:
1.lock()方法是用来获取锁的,如果锁已被其他线程获取,则进行等待。使用lock必须在try-catch 块中进行,释放锁必须在finally 块中进行,因为如果抛出了异常,这个锁永远都不会被释放。
2.tryLock():请求加锁,如果加锁不成功返回false,不会发生阻塞
3.tryLock(long time,TimeOut unit)throws InterruptedException:请求加锁,如果加锁不成功会在规定的时间内阻塞,超时后会返回,支持中断
4.lockInterruptibly()throws InterruptedException:请求加锁,如果请求不到锁会发生阻塞,在阻塞过程中允许中断
*/
synchronized 与 lock 锁的区别:
由于 synchronized 是 JVM 的内置锁,所以对它可进行的干预很少,甚至不需要自己来释放锁。除此之外, JVM还对内置锁做了一些优化,所以建议只有在内置锁无法满足需求的情况下,才选择使用 ReentrantLock。比如:可定时、可轮询、可中断的锁获取操作,以及非块结构(相当于ConcurrentHashMap 中的锁分段)。
Queue:
BlockingQueue:可阻塞队列,如果队列为空,获取操作将一直阻塞,直到队列出现一个 可用的元素;如果队列已满,则插入元素的操作将一直阻塞,直到队列出现可用的空间。阻塞队列一般用于生产者-消费者模式
Concurrent
Deque:Deque是对Queue的扩展,它是一个双端队列,实现了在队列头和队列尾的高效插入和移除
标签:
原文地址:http://blog.csdn.net/followmyinclinations/article/details/51881364