zoukankan      html  css  js  c++  java
  • 多线程并发最佳实践

    1. 使用本地变量

    应该总是使用本地变量,而不是创建一个类或实例变量,通常情况下,开发人员使用对象实例作为变量可以节省内存并可以重用,因为他们认为每次在方法中创建本地变量会消耗很多内存。

    2.使用不可变类

    不可变类比如String Integer等一旦创建,不再改变,不可变类可以降低代码中需要的同步数量。

    3.最小化锁的作用域范围

    任何在锁中的代码将不能被并发执行,如果你有5%代码在锁中,那么根据Amdahl's law,你的应用程序就不可能提高超过20倍,因为锁中这些代码只能顺序执行,降低锁的涵括范围,上锁和解锁之间的代码越少越好。

    4.使用线程池的Excutor,而不是直接new Thread执行

    创建一个线程的代价是昂贵的,如果你要得到一个可伸缩的Java应用,你需要使用线程池,使用线程池管理线程。JDK提供了各种ThreadPool线程池和Executor。

    5.宁可使用同步而不要使用线程的wait notify

    从Java 1.5以后增加了需要同步工具如CycicBariier, CountDownLatch 和 Sempahore,你应当优先使用这些同步工具,而不是去思考如何使用线程的wait和notify,通过BlockingQueue实现生产-消费的设计比使用线程的wait和notify要好得多,也可以使用CountDownLatch实现多个线程的等待。

    6.使用BlockingQueue实现生产-消费模式

    大部分并发问题都可以使用producer-consumer生产-消费设计实现,而BlockingQueue是最好的实现方式,堵塞的队列不只是可以处理单个生产单个消费,也可以处理多个生产和消费。

    7. 使用并发集合Collection而不是加了同步锁的集合

    Java提供了 ConcurrentHashMap CopyOnWriteArrayList 和 CopyOnWriteArraySet以及BlockingQueue Deque and BlockingDeque五大并发集合,宁可使用这些集合,也不用使用Collections.synchronizedList之类加了同步锁的集合, CopyOnWriteArrayList 适合主要读很少写的场合,ConcurrentHashMap更是经常使用的并发集合

    8.使用Semaphore创建有界

    为了建立可靠的稳定的系统,对于数据库 文件系统和socket等资源必须有界bound,Semaphore是一个可以限制这些资源开销的选择,如果某个资源不可以,使用Semaphore可以最低代价堵塞线程等待

    9.宁可使用同步代码块,也不使用加同步的方法

    使用synchronized 同步代码块只会锁定一个对象,而不会将当前整个方法锁定;如果更改共同的变量或类的字段,首先选择原子性变量,然后使用volatile。如果你需要互斥锁,可以考虑使用ReentrantLock

    10. 避免使用静态变量

    静态变量在并发执行环境会制造很多问题,如果你必须使用静态变量,让它称为final 常量,如果用来保存集合Collection,那么考虑使用只读集合。

  • 相关阅读:
    mysql分页查询语法
    不同浏览器CSS样式不兼容问题
    js引入jquery问题
    ElasticSearcher的安装以及安装过程中出现的问题
    Mybites逆向工程的搭建
    Maven遇到的各种问题
    Maven安装和配置
    Maven报错:Unsupported major.minor version 51.0
    teamviewer远程是账号密码都没错但是报正在初始化参数...
    远程服务器时无密码登录
  • 原文地址:https://www.cnblogs.com/xiangkejin/p/9276524.html
Copyright © 2011-2022 走看看