原文链接:http://coolxing.iteye.com/blog/1236909
两种互斥锁机制:
1、synchronized
2、ReentrantLock
ReentrantLock是jdk5的新特性,采用ReentrantLock可以完全替代替换synchronized传统的锁机制,而且采用ReentrantLock的方式更加面向对象,也更加灵活,网上有很多关于对比两者锁方式的文章,这里就不多口舌了,大家baidu、google一下就水落石出了。在本博客中也写关于这两种锁方式实现的经典例子《生产者消费者》。
synchronized方式:《java线程:三种方式实现生产者消费者问题_1》
ReentranLock方式:《java线程:三种方式实现生产者消费者问题_2》
关于读写锁,用语言解释不如直接用代码诠释,以下通过两个例子讲述读写锁以及读写锁的使用:
例子1:
- import java.util.HashMap;
- import java.util.Map;
- import java.util.concurrent.locks.ReadWriteLock;
- import java.util.concurrent.locks.ReentrantReadWriteLock;
-
- public class CachedData {
-
-
- private static CachedData cachedData = new CachedData();
- private final ReadWriteLock lock = new ReentrantReadWriteLock();
- private Map<String, Object> cache = new HashMap<String, Object>();
-
- private CachedData(){
- }
-
- public static CachedData getInstance(){
- return cachedData;
- }
-
-
- public Object read(String key) {
- lock.readLock().lock();
- Object obj = null;
- try {
- obj = cache.get(key);
- if (obj == null) {
- lock.readLock().unlock();
-
- lock.writeLock().lock();
- try {
- if (obj == null) {
- obj = "查找数据库";
-
- cache.put(key, obj);
- }
- } finally {
-
-
-
-
-
- lock.readLock().lock();
- lock.writeLock().unlock();
- }
- }
- } finally {
- lock.readLock().unlock();
- }
- return obj;
- }
- }
例子2:
- import java.util.Map;
- import java.util.TreeMap;
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReadWriteLock;
- import java.util.concurrent.locks.ReentrantReadWriteLock;
-
- import javax.xml.crypto.Data;
-
- public class RWDictionary {
-
- private final Map<String, Data> map = new TreeMap<String, Data>();
- private final ReadWriteLock rwl = new ReentrantReadWriteLock();
- private final Lock readLock = rwl.readLock();
- private final Lock writeLock = rwl.writeLock();
-
- public Data get(String key) {
- readLock.lock();
- try {
- return map.get(key);
- } finally {
- readLock.unlock();
- }
- }
-
- public String[] allKeys() {
- readLock.lock();
- try {
- return (String[]) map.keySet().toArray();
- } finally {
- readLock.unlock();
- }
- }
-
- public Data put(String key, Data value) {
- writeLock.lock();
- try {
- return map.put(key, value);
- } finally {
- writeLock.unlock();
- }
- }
-
- public void clear() {
- writeLock.lock();
- try {
- map.clear();
- } finally {
- writeLock.unlock();
- }
- }
- }
转发 :java线程:互斥锁与读写锁
原文:http://www.cnblogs.com/petroe/p/4661463.html