Lock与synchronized的区别
程序员文章站
2024-01-08 08:34:40
...
Lock的公平锁与非公平锁:
公平锁(FairSync):直接将获取锁的操作放到等待队列中,谁先抢到锁谁先执行。
非公平锁(NoFairSync): 先获取锁,获取到则执行,未获取到则放入等待队列。
因为从线程进入了RUNNABLE状态,可以执行开始,到实际线程执行是要比较久的时间的。而且,在一个锁释放之后,其他的线程会需要重新来获取锁。其中经历了持有锁的线程释放锁,其他线程从挂起恢复到RUNNABLE状态,其他线程请求锁,获得锁,线程执行,这一系列步骤。如果这个时候,存在一个线程直接请求锁,可能就避开挂起到恢复RUNNABLE状态的这段消耗,所以性能更优化。
ReentrantLock()默认使用的非公平锁。
Lock的读写锁
读读操作非互斥,读写操作互斥,写读操作互斥,写写操作互斥,读写锁提高了读多写少案例的并发性能。
读写锁实现高效缓存:
/**
* 使用Lock的读写锁实现高效缓存,使用单例模式实现缓存对象的唯一性
* @author zsc
* @datetime 2017年11月13日 下午3:27:26
*/
public class Cache implements Serializable {
private static final long serialVersionUID = 1L;
// 缓存对象
private static Cache instance = null;
// 缓存容器
static Map<String, Object> cache = new HashMap<String, Object>();
// 读写锁
static ReentrantReadWriteLock rrwl = new ReentrantReadWriteLock();
// 读锁
static Lock readLock = rrwl.readLock();
// 写锁
static Lock writeLock = rrwl.writeLock();
/**
* 构造方法私有化,禁止调用构造方法生成缓存对象
*/
private Cache() {
super();
}
/**
* 单例模式,获取缓存对象
* @return
*/
public static Cache getInstance() {
if(null == instance) {
synchronized (instance) {
if(null == instance) {
instance = new Cache();
}
}
}
return instance;
}
/**
* 根据Key查询缓存
* @param key
* @return
*/
public Object get(String key) {
try {
readLock.lock();
return cache.get(key);
} catch (Exception e) {
e.printStackTrace();
} finally {
readLock.unlock();
}
return null;
}
/**
* 设置缓存
* @param key
* @param value
*/
public void set(String key, String value) {
try {
writeLock.lock();
cache.put(key, value);
} catch (Exception e) {
e.printStackTrace();
} finally {
writeLock.unlock();
}
}
/**
* 移除指定Key的缓存,默认返回被移除的value,key不存在则返回null
* @param key
* @return
*/
public Object remove(String key) {
try {
writeLock.lock();
return cache.remove(key);
} catch (Exception e) {
e.printStackTrace();
} finally {
writeLock.unlock();
}
return null;
}
/**
* 清除所有缓存
*/
public void clear() {
try {
writeLock.lock();
cache.clear();
} catch (Exception e) {
e.printStackTrace();
} finally {
writeLock.unlock();
}
}
}
推荐阅读
-
Lock与synchronized的区别
-
synchronized与Lock的区别
-
synchronized与lock的区别
-
java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
-
Java悲观锁与乐观锁的区别及使用场景
-
Synchronized与ReentrantLock(重入锁)的区别
-
深入eAccelerator与memcached的区别详解_php技巧
-
总结加载css中link与@import的几点区别
-
mysql中int、bigint、smallint 和 tinyint的区别与长度的含义
-
mysql中having语句与where语句的用法与区别_MySQL