Lock
Lock lock = newReentrantLock();
lock()
用来取得对象的锁定。
unlock()
用来释放对象的锁定,通常由同一个Lock对象来调用lock()与unlock()。
读写锁
多个读锁不互斥,读锁和写锁互斥,写锁和写锁互斥。
读写锁模拟缓存例子:
public ObjectgetData(String key){
rwl.readLock().lock();//上读锁
Object value = null;
try{
value = cache.get(key);//获取数据
if(value==null){//如果没有
rwl.readLock().unlock();//解开读锁
rwl.writeLock().lock();//上写锁
try {
if(value==null){//判断数据是否已存在,防止已有线程进入第一层判断,被打断后重写数据
value = "aaa";
}
} finally {
rwl.writeLock().unlock();//解开写锁
}
rwl.readLock().lock();//还原成读锁
}
}finally{
rwl.readLock().unlock();//释放读锁
}
return value;
}
Condition的功能类似传统线程技术中的Object.wait和Object.notify的功能
Lock lock = new ReentrantLock();
Condition condition =lock.newCondition();
……
condition.await();
……
condition.signal();
Semaphore实现信号灯
Semaphore可以维护当前访问自身的线程数,并提供了同步机制。实现Semaphore可以控制同时访问资源的线程数,例如,实现一个允许的并发访问数。
CyclicBarrier
表示大家彼此等待,大家集合好后才开始出发,分散活动后又在指定地点集合碰面。
CountDownLatch
计数器到达零后,线程开始运行。
Exchanger
用于实现两个人直接的数据交换,每个人在完成一定的事物后想与对方交换数据,第一个先拿出数据的人将一直等待第二个人拿着数据到来时,才能彼此交换数据。
---------------------- android培训、java培训、期待与您交流!
----------------------详细请查看:http://edu.csdn.net/heima
本文深入探讨了Java并发编程中Lock接口的使用方法,包括ReentrantLock的加锁与解锁操作,以及读写锁的实现原理与应用场景。通过具体示例说明了如何利用读写锁优化缓存系统的效率,并介绍了Condition、Semaphore、CyclicBarrier等并发工具类的作用。

1194

被折叠的 条评论
为什么被折叠?



