`
lionlx
  • 浏览: 286521 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

WeakHashMap的并发应用

阅读更多
第一步:生成一个全局WeakHashMap变量

private static WeakHashMap<String, Object> lockMap = new WeakHashMap<String, Object>(50);

第二步:从MAP中取对象。如果有就取出,如果没有就新建放到MAP中


 /**
  * 得到同步锁,用完丢弃即可
  * 
  * @param key
  * @return
  */
 protected static Object getSynLockObject(String key) {
  synchronized (lockMap) {
  Object o = lockMap.get(key);
  if (o == null) {
  o = new Object();
  lockMap.put(key, o);
  }
  return o;
  }
 }


第三步:锁住不同的对象,这样可以对同一对象进行同步。不同对象可以并发
 public boolean processPaymentResult(YeepayResult result) {
  long orderSeqId = result.getOrderSeqId();
  // 只要这个Key不丢,同步锁就能起作用,所以要显式的引用这个key值
  String synLockKey = String.valueOf(orderSeqId);
  Object synLock = PayCenter.getSynLockObject(synLockKey);
  /**
  * 对同一个订单的操作需要进行同步,防止出错
  */
  synchronized (synLock) {
  return synchroProcessPaymentResult(result);
  }
 }




例:并发情况下,对数据进行加1操作,插入数据库
	private Map<String, String> lockMap = new WeakHashMap<String,String>(); //confirm every thread get lock object is the same object
	private String lockPrefix = this.getClass().getName()+"incrementSequenceNum";
	private int incrementSequenceNum(String sID, String tID, TopicIndexItem cacheTopic){
		String syn = lockPrefix + sID+tID;
		String value = lockMap.get(syn);
		if(value == null){
			synchronized(lockPrefix){
				if(lockMap.get(syn)==null){
					lockMap.put(syn, syn);
				}
			}
			value = lockMap.get(syn);
		}
		//syn = syn.intern();
		int sequenceNum = 0;
		synchronized(value){
			sequenceNum = DB.getTopicSequenceNum(sID, tID)+1;
			DB.incrementTopicSequenceNum(sID, tID);
			if(cacheTopic!=null){
				cacheTopic.setMaxSequenceNum(sequenceNum);
			}
		}
		return sequenceNum;
	}
分享到:
评论

相关推荐

    线程死锁CPU过高,请求原因分析

    1. **锁竞争**:虽然WeakHashMap本身的内部实现是线程安全的,但在并发访问时,如果多个线程同时操作同一个WeakHashMap,可能会引发锁竞争,导致CPU升高。 2. **弱引用清理**:垃圾回收器清理弱引用时,如果这个过程...

    Android高级应用源码-下载网络图片 (整合多线程、内存缓存、本地文件缓存~).rar

    `ExecutorService`配合`ThreadPoolExecutor`可以灵活地管理和调度线程池,控制并发数量,防止过度消耗系统资源。 3. **内存缓存**: - 图片加载框架如`Picasso`、`Glide`和`Fresco`等提供了内存缓存机制,将最近...

    douBanList(滚动到底部加载新的,软缓存,懒加载)Android源码.rar

    在Android中,可以使用WeakHashMap或者LruCache等数据结构来实现。在" douBanList "项目中,软缓存可能被用来存储从网络获取的书籍信息,避免每次滚动到底部时都重新下载相同的数据。当需要显示数据时,首先检查缓存...

    Java基础总结下1

    Map接口的实现有HashMap、LinkedHashMap、TreeMap和WeakHashMap,HashMap提供快速查找,LinkedHashMap保持插入顺序,TreeMap按自然顺序或定制比较器排序,WeakHashMap则使用弱引用键。此外,Hashtable是古老的线程...

    Map-main-源码.rar

    这种特性使得LinkedHashMap在需要保持插入顺序或访问顺序的应用场景中非常有用。 四、ConcurrentHashMap ConcurrentHashMap是线程安全的HashMap实现,它在并发环境下提供了高效的操作。ConcurrentHashMap采用了...

    完整版Java web开发教程PPT课件 Java开发进阶教程 第20章 数据库连接池,缓存(共15页).pptx

    创建数据库连接是一个相对耗时的过程,尤其是在高并发的Web应用中,每次请求都新建连接会极大地消耗系统资源。连接池预先初始化一定数量的连接,在应用需要时提供已存在的连接,使用完毕后再归还,从而提高了效率并...

    2018最新Java面试题详细版.zip_2018 面试_E98_Java面试题2018_java2018面试_java面试

    Java作为一款广泛应用的编程语言,其面试题目往往涵盖了语言基础、数据结构、算法、多线程、并发编程、设计模式、框架应用等多个方面。以下是对2018年Java面试核心知识点的详尽解析: 1. **Java语言基础** - **...

    Android异步加载图像小结 (含线程池,缓存方法).zip

    同时,可以自定义缓存策略,如使用`WeakHashMap`作为内存缓存,配合`SharedPreferences`或文件系统实现磁盘缓存。 总的来说,Android异步加载图像涉及到多线程编程、缓存策略以及性能优化等多个方面。通过合理使用...

    Java concurrency之集合_动力节点Java学院整理

    本文主要围绕Java集合框架中的`Collection`和`Map`类,以及它们在并发编程中的应用进行阐述。 首先,`Collection`集合主要包含`List`和`Set`两个子接口。`List`接口代表有序的集合,允许有重复元素,常见的实现类有...

    HASHMAP缓存.txt

    - **使用弱引用**:对于大型或不经常使用的数据,可以考虑使用`WeakHashMap`替代,这样在内存紧张时,这些数据会被垃圾回收器清理。 - **定期清理**:根据应用需求,可以定期清理不再使用的缓存条目,以释放内存资源...

    map的概要介绍与分析

    - **内存敏感性**:对于内存敏感的应用程序,可以考虑使用`WeakHashMap`或其他更轻量级的实现。 - **并发需求**:在多线程环境中,应选择线程安全的Map实现,如Java中的`ConcurrentHashMap`,或者使用`std::...

    java程序性能优化

    理解对象引用的强、软、弱、虚四种类型,以及如何使用 WeakHashMap 或 PhantomReference 进行精细内存控制也很重要。 3. **线程调度**:多线程是Java的一大特性,但并发执行也可能带来性能问题。合理设置线程池大小...

    request包装的,实现request属性共享内存管理

    3. **内存优化**:可能包含了智能的缓存策略,例如使用WeakHashMap来存储属性,避免内存泄漏。 4. **远程会话支持**:如果类名暗示了远程会话功能,那么它可能包含了序列化和反序列化请求属性,以及在网络间传递会话...

    java缓存技术深入剖析

    1. **本地缓存**:如Java的`WeakHashMap`、`SoftReference`等,通常用于单个JVM内部,适用于小规模的数据存储。 2. **分布式缓存**:如Hazelcast、Infinispan、Ehcache和广为人知的Apache Ignite,适用于多节点环境...

    20个最佳的Java集合框架面试题目.zip

    HashMap、TreeMap、WeakHashMap和ConcurrentHashMap是常见的实现。 8. **并发处理**:在多线程环境下,集合框架中的ConcurrentHashMap、CopyOnWriteArrayList和CopyOnWriteArraySet提供了线程安全的解决方案。 9. ...

    Java 常见疑难解Java 常见疑难解

    - **JVM参数设置**:根据应用需求调整JVM内存大小、垃圾回收策略、并行/并发级别等参数,以达到最佳性能。 - **性能监控**:使用JMX、VisualVM等工具监控JVM状态,及时发现和解决问题。 8. **泛型与类型擦除**: ...

    一个讲解很清晰的Java集合框架PPT

    而WeakHashMap则使用弱引用作为键,当键不再被引用时,键值对会自动从映射中移除。 PPT可能涵盖了这些接口的详细特性,包括它们的实现类、操作方法、性能分析,以及如何根据实际需求选择合适的集合类型。此外,还...

    Android-异步图片加载器

    - 优化后的`AsyncTask`可能包括了对线程池的自定义配置,避免并发任务过多导致系统资源浪费,以及更好的内存管理,防止由于引用不当造成的内存泄漏。 3. **图片缓存机制**: - 异步图片加载框架通常包含内存缓存...

    Java中List、ArrayList、Vector及map、HashTable、HashMap分别的区别.

    HashMap是非同步的,适合于高并发环境下,但如果不考虑线程安全,HashMap的性能优于同步的HashTable。 4. HashTable类 HashTable是早期的同步Map实现,它不允许键和值为null。与HashMap相比,HashTable的同步特性...

    java基础之集合面试题共4页.pdf.zip

    8. **并发集合**:Java并发库提供了如ConcurrentHashMap、CopyOnWriteArrayList等线程安全的集合实现,用于多线程环境下的数据共享。 9. **集合操作**:包括添加(add)、删除(remove)、查找(contains)、清空...

Global site tag (gtag.js) - Google Analytics