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:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值