`
pengpeng
  • 浏览: 82379 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java concurrent programming

 
阅读更多

 随着多核cpu的发展,以及线程技术的普及使用。并行编程成了必须掌握的技能。这里列出了java常用的一些并行编程API;

0. 起源

        最早的计算机一个cpu,并且cpu单核。某个时间只有一个进程或线程在cpu上执行。不存在某一时间有多个线程访问同一个数据的问题,也就不存在并发编程了。随着cpu上多核以及cpu上L1/L2/L3 cache技术的发展,程序员编写出并行运行的多线程程序能更好的利用cpu资源;提高程序性能;

        当今我们使用的多核CPU大多是基于SMP架构的。SMP架构简单说就是单个CPU上集成了多核,但是多核共享cpu上的高速缓存L1/L2/L3,但是多核是各自从L1/L2/L3上划分了自己的缓存区域,之间互不影响;

        问题来了,既然CPU上的高速缓存对各个核之间都不可见,那么操作系统调度线程时一会儿将一个线程调度到核1上去执行,过几个时间片后又调度到核2上去执行,那么如果核1的L1/L2/L3cache没有fluch到主存,会造成核2运行此进程时,用的旧数据。这个问题,操作系统已将帮忙解决了,操作系统调度程序将进程调度到核2上去执行前已将将核1的L1/L2/L3flush到主存了,我们不必关系;而且操作系统利用亲和算法,将同一个进程尽量调度到同一个核上去,避免缓存失效导致的性能问题; 

1. ThreadLocal

    threadLocal这个类是java api提供的一个api; 其实就是每个thread都存各自的一份数据,也就不存在并发编程的问题了。其实并发编程就是为了保护数据,避免不同线程访问一个数据时出现交错,而互相覆盖,造成脏数据; 
 

2. 互斥锁

    所以为了保证数据的一直性,通过互斥锁来要求不同线程顺序访问数据,只有持有这个锁的线程才能访问被保护数据,其他线程等待锁;

    对应与java里的notify,wait,notifyall等api; 以及synchronized关键字; 
 

3. CAS(compareAndSwap)

     是一个cpu提供的一个硬件级的命令,这个命令试图设置一个变量,如果设置成功,说明无线程在访问次变量。一般通过无限for循环调用。 
 

4. 集合(concurrent 包)

  concurrent包中实现各种高性能的集合类;concurrentHashMap,concurrentArrayList等等;里边多用轻量级的CAS操作,所以性能很好。

Labels:

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics