并发程序的性能思考

首先说下线程的死锁,个人想法(从艺术家吃饭说起):
  1.必须有资源想被多个线程独占,但是资源不能共享,也就是一次只能一个线程用
  2.一个线程抢占一个资源然后再等待另外一个线程(大家都这样)
  3.资源不能被强占,大家都是优先级相同的线程,都在那里等
  4.发生循环等待了(多个锁)
 避免死锁就是打破上面任何一条

    一个并发程序好坏大致需要两个方面:响应速度和伸缩性,也即是有多快和有多少,这往往是相互矛盾的两方面,我们需要做的就是平衡这两方面。
    从并发程序的特点看,我们可以从以下几方面入手性能的优化:
    1 多线程执行那么必须在多个线程里面上下切换,这需要操作系统保存上个线程的多线程,创建或者唤醒下个线程,这个都消耗资源。所以减少上下文切换,可以增加伸缩性(多几个线程执行)
    2  synchronized同步块,同步块意味着这个里面是单线程执行的,既是串行执行,其中synchronized保持了内存的可见性和原子性,volatile保证了可见性,这都使得线程的工作内存的内容每一次都要交换到主内存中,这样的话工作内存的缓存失效,所以尽量的缩小同步,也可以使用concurrent包的lock显示锁定。
   3  阻塞,这个看看io和nio就知道了,可以将阻塞的操作移除出我们主要的线程,另外起线程处理
   4  锁,这个在并发中很重要,可以减小持有的锁的时间(尽量的缩小同步块等),减少对锁的占用时间,比如拆分锁,读写分离锁,或者是分成好几个锁(concurrenthashmap),把独占锁分成多个锁
   5  线程池管理线程的创建和生命周期,减少创建和销毁线程的消耗
   6.不可变对象,抛弃一切的同步
   7.spinlock,lock-free,mutex都有各自的使用场景,在并发竞争不激烈的情况下,spinlock,lock-free能保持应用的低延时,在高并发的时候mutex则能保持很高吞吐量
 最重要的是在这之前我们需要审视我的环境:cpu,网络,i/0,数据库等等

 

posted @ 2012-07-16 13:49  nod0620  阅读(340)  评论(0编辑  收藏  举报