`

随手记:巧妙设计,并发场景下突破常规synchronize,提高读写效率

阅读更多

1、Peterson 算法(Dekker算法的演化),这个算法设计得很巧妙,理解的核心就是搞清楚三个标志位是怎样控制两个方法对临界区的访问的:

volatile int flag1 = 0; //主观因素:flag1表示方法1自身是否要求进入临界区 
volatile int flag2 = 0; //主观因素:flag2表示方法2自身是否要求进入临界区 
volatile int turn = 1; //客观因素:turn取1和2分别表示当前临界区针对方法1还是方法2开放

void fun1(){ 
  flag1 = 1; 
  turn = 2; 
  while( flag2==1 && turn==2 ){} //只有在方法2自身要求进入临界区且临界区针对方法2开放时,方法1才会阻塞 
  //Critical Section 
  ... //临界区内 
  flag1 = 0; 
} 

void fun2(){ 
  flag2 = 1; 
  turn = 1; 
  while( flag1==1 && turn==1 ){} //只有在方法1自身要求进入临界区且临界区针对方法1开放时,方法1才会阻塞 
  //Critical Section 
  ... //临界区内 
  flag2 = 0; 
}

 

 

 

2、ConcurrentHashMap,设计巧妙,用桶粒度的锁,避免了put和get中对整个map的锁定,尤其在get中,只对一个HashEntry做锁定操作,性能提升是显而易见的。


细节参见 http://www.iteye.com/topic/344876 ,有详细的讨论。

Mark: https://www.ibm.com/developerworks/java/library/j-jtp08223/ ,这里有关于Java内存模型结合ConcurrentHashMap的分析。

 

3、主题泛化:无锁(Lock-Free)并发编程

在Lock-Free世界里,最简单也最普遍的一个通用原语是CAS(Compare and Swap)操作。支持并发的现代的处理器都提供了这个原语的硬件实现。CAS原语负责比较某个内存地址处的内容与一个期望值,如果比较成功则将该内存地址处的内容替换为一个新值。这整个操作是原子的。

这里有对无锁并发编程的介绍:http://www.cnblogs.com/lucifer1982/archive/2008/04/16/1154727.html

Java并发框架汇总:http://www.groovyq.net/content/java%E5%B9%B6%E5%8F%91%E6%A1%86%E6%9E%B6%E5%9B%9E%E9%A1%BE

 

最后,这里有一个专题页:

https://www.ibm.com/developerworks/cn/java/j-concurrent/

 

PS:HashMap不是线程安全的,错误的使用并发状况下可能出现CPU100%的状况,在性能问题定位中遇到了,记录:

/** 
* Transfers all entries from current table to newTable. 
*/ 
void transfer(Entry[] newTable) { 
    Entry[] src = table; 
    int newCapacity = newTable.length; 
    for (int j = 0; j < src.length; j++) { 
        Entry e = src[j]; 
        if (e != null) { 
            src[j] = null; 
            do { 
                Entry next = e.next; 
                int i = indexFor(e.hash, newCapacity); 
                e.next = newTable[i]; 
                newTable[i] = e; 
                e = next; 
            } while (e != null); 
        } 
    } 
}


 

问题最终就出现在HashMap中transfer方法的这个while循环上,这个方法在HashMap扩容时调用,详细分析见:

http://blog.sina.com.cn/s/blog_56146a210100owft.html

  • 大小: 130 KB
分享到:
评论

相关推荐

    delphi vcl线程同步synchronize

    本文将深入探讨Delphi VCL线程同步以及Synchronize方法的工作原理、使用场景和最佳实践。 ### 1. 线程同步基础 在多线程环境中,多个线程可能同时访问同一资源,这可能导致数据不一致或者竞态条件。为了防止这些...

    FTP_synchronize_0_9_6_1_dll

    此外,该插件还支持文件和文件夹的批量上传和下载,以及版本比较功能,极大地提高了开发效率。 总之,FTP_synchronize_0_9_6_1_dll为Notepad++带来了强大的FTP文件同步功能,是开发者进行远程项目协作和版本控制的...

    java synchronize 线程同步

    这种方法可以提高程序的效率,因为如果代码块中只涉及到某个特定对象的操作,我们可以只锁定那个对象,而不是整个方法的所有操作。 ### 总结 `synchronized`关键字在Java中起到了至关重要的角色,它是保证多线程...

    CALL RFC synchronize and asychronize Examples

    而异步调用适用于不急需结果,且希望提高程序执行效率的场景。选择哪种调用方式取决于具体业务需求和系统性能的平衡。在SAP环境中,理解并灵活运用同步和异步RFC调用,对于优化系统资源和提升程序效率至关重要。

    (完整版)异步FIFO设计.pdf

    异步FIFO 设计是指在多时钟系统中,使用异步FIFO 作为不同时钟域数据传输的缓冲区,以解决数据传输的时序要求和提高传输效率的问题。下面是异步FIFO 设计的知识点总结: 一、概述 异步FIFO 设计的目的是解决多时钟...

    线程与并发:Ruby并行世界的探索之旅

    6. **Ruby on Rails**:这是一个基于 Ruby 的流行 Web 开发框架,极大地提高了开发效率。 Ruby 在 Web 开发、脚本编写、自动化任务等多个领域都有广泛的应用。 #### 线程与并发基础 在现代软件开发中,为了提高...

    线程读写缓冲

    这种设计使得线程可以在不干扰其他线程的情况下进行读写操作,提高了程序的并行性。 在Delphi编程环境中,实现线程读写缓冲可以利用内置的TThread.Synchronize和TThread.Queue方法,以及各种锁机制,如TMonitor、...

    Java synchronize底层实现原理及优化

    另外,synchronize 底层实现原理优化还可以通过使用读写锁来提高效率。读写锁是一种锁机制,它允许多个线程同时读取资源,但只能有一个线程写入资源。 在实际应用中,synchronize 底层实现原理优化可以通过使用 ...

    synchronize.pdf

    锁可以根据竞争情况在这些状态之间转换,以提高效率。 8. Synchronized 和可重入性:synchronized 是可重入锁,即一个线程可以多次进入同一个synchronized 块。每次进入时,计数器递增,退出时计数器递减。当计数器...

    Synchronize It 3.5文件夹同步器 简体中文界面

    Synchronize It!还有其他特点如下: 1.可以自订许多的项目,包括过滤器、专案、颜色等等。 2.可以进行多种同步任务独立保存和点用,也可组合多个任务一次同步搞定。 3.支持压缩文件的同步。 4.内建二进位文件的比较...

    Java对象锁和类锁全面解析(多线程synchronize

    为了提高效率,Java提供了更高级的锁机制,如读写锁(ReentrantReadWriteLock)、显式锁(java.util.concurrent.locks.Lock接口的实现,如ReentrantLock)、条件变量(Condition)等。这些高级锁允许更细粒度的控制...

    Java编程中“为了性能”需做的26件事

    1. **选择正确的数据结构**:使用适合场景的数据结构(如ArrayList、HashSet、HashMap)可以显著提高程序效率。 2. **避免过度的对象创建**:频繁创建对象会增加垃圾收集的负担,考虑复用对象或使用对象池。 3. **...

    Python库 | synchronizer_framework-0.0.2-py3-none-any.whl

    总的来说,`synchronizer_framework`库为Python开发者提供了一套完整的工具集,以解决并发编程中的同步问题,提高代码的效率和可维护性。通过使用这个库,开发者可以更加专注于业务逻辑,而不用过于担忧底层同步细节...

    突破Delphi 7.0编程实例五十讲

    - **并发编程**:探讨如何在Delphi 7.0中使用线程,提高程序执行效率。 - **异步操作**:介绍异步调用和回调机制,如TThread和Synchronize方法。 6. **程序发布与国际化** - **安装制作**:讲解如何使用Inno ...

    笨鸟学iOS开发(2)读写用户偏好源代码

    - 虽然`synchronize`方法可以确保数据立即保存,但通常情况下并不需要频繁调用,因为系统会定期自动同步。 - 如果需要处理多线程环境下的用户偏好,应使用`suiteName`参数创建特定的用户偏好实例,以避免数据冲突...

    synchronize.zip

    在IT行业中,尤其是在Java编程领域,`synchronize.zip`这个文件名可能暗示着一个与同步相关的项目或代码库。从提供的文件列表来看,我们可以推测这是一个关于处理店铺操作任务的系统,比如更新店铺任务...

    OrCAD Capture 多模块设计文档操作步骤 -V1.0版本.pdf

    OrCAD Capture是一款强大的电路设计软件,常用于硬件工程师进行电路图的设计和管理。在这个V1.0版本的操作文档中,详细介绍了...对于硬件工程师来说,掌握这些步骤能够有效地组织和管理复杂的电路设计,提高工作效率。

    10个常见触发IO瓶颈的高频业务场景.doc

    本文档《10个常见触发IO瓶颈的高频业务场景》着重于如何从应用业务层面来解决这一问题,以提高IO效率和降低IO负担。以下是文档内容的详细解读: 首先,确定IO瓶颈和识别高IO的语句至关重要。通过查询`pgxc_thread_...

    cadence学习笔记

    在进行CADENCE或orCAD的学习时,理解其工作流程、熟悉各种工具的使用以及掌握设计规则至关重要,这将有助于提高设计效率和设计质量。同时,持续学习和了解新的设计策略和技术也是保持竞争力的关键。

    Java synchronize线程安全测试

    Java中synchronize关键字的使用与线程安全测试 Java语言中,synchronize关键字是一个非常重要的概念,它主要用于解决线程安全问题。在多线程编程中,经常会出现线程安全问题,因为多个线程可能会访问同一个共享资源...

Global site tag (gtag.js) - Google Analytics