总结:各种加锁方法对于Map .(转)
来源:互联网 发布:阿里云虚拟主机访问php 编辑:程序博客网 时间:2024/05/22 15:26
hashmap是不带有锁的,hashtable是带有锁的,多线程使用过程中,需要对hashmap加锁,可以用
1.使用 synchronized 关键字,这也是最原始的方法。代码如下
synchronized(anObject) {
value = map.get(key);
}
2.使用 JDK1.5 提供的锁(java.util.concurrent.locks.Lock)。代码如下2.
- lock.lock();
- value = map.get(key);
- lock.unlock();
3.这样处理时对于hashmap的读写都加锁了,但是如果涉及到少量插入及频繁的查找,那么上面两种的效率不是很高,这时候最好的方式是加读写锁。以下为构造读写锁包装map的方法:
- <SPAN style="FONT-SIZE: 18px">import java.util.Map;
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReadWriteLock;
- import java.util.concurrent.locks.ReentrantReadWriteLock;
- public class ReadWriteMap<K, V> {
- private final Map<K, V> map;
- private final ReadWriteLock lock = new ReentrantReadWriteLock();
- private final Lock r = lock.readLock();
- private final Lock w = lock.writeLock();
- public ReadWriteMap(Map<K, V> map) {
- this.map = map;
- }
- public V put(K key, V value) {
- w.lock();
- try {
- return map.put(key, value);
- } finally {
- w.unlock();
- }
- }
- public V get(Object key) {
- r.lock();
- try {
- return map.get(key);
- } finally {
- r.unlock();
- }
- }
- }</SPAN>
<span style="font-size:18px;">import java.util.Map;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;public class ReadWriteMap<K, V> {private final Map<K, V> map;private final ReadWriteLock lock = new ReentrantReadWriteLock();private final Lock r = lock.readLock();private final Lock w = lock.writeLock();public ReadWriteMap(Map<K, V> map) {this.map = map;}public V put(K key, V value) {w.lock();try {return map.put(key, value);} finally {w.unlock();}}public V get(Object key) {r.lock();try {return map.get(key);} finally {r.unlock();}}}</span>
4、使用 JDK1.5 提供的 java.util.concurrent.ConcurrentHashMap 类。该类将 Map 的存储空间分为若干块,每块拥有自己的锁,大大减少了多个线程争夺同一个锁的情况。代码如下
这种方式最快
结论:
1、如果 ConcurrentHashMap 够用,则使用 ConcurrentHashMap。
2、如果需自己实现同步,则使用 JDK1.5 提供的锁机制,避免使用 synchronized 关键字。
0 0
- 总结:各种加锁方法对于Map .(转)
- 总结:各种加锁方法对于Map
- 加锁方法对于Map
- java中遍历map的各种方法总结
- 对于数组的every、filter、forEach、map、some方法的区别总结
- 加锁的各种选择
- map方法总结
- Map 遍历方法总结
- Map的方法总结
- 各种排序方法总结
- 各种排序方法总结
- 各种排序方法总结
- 各种排序方法总结
- 各种排序方法总结
- 各种排序方法总结
- 各种排序方法总结
- 素数各种方法总结
- 各种排序方法总结
- 开源框架 图片下载
- CGAffineTransform
- javascript中in运算符详解
- 关于伪终端的几点记录
- 修改git bash 默认路径
- 总结:各种加锁方法对于Map .(转)
- apple watch 开发关键知识点
- 分页技术基本新思路:--有道笔记整理
- 图片加载与缓存开源框架:Glide
- JavaScript 贪吃蛇实现
- Android手机安装busybox
- 资深软件开发人员分享对新手程序员的建议
- 关于数据的增加和修改的思考--有道笔记的整理
- iOS 疯狂讲解之CocoaPods