zoukankan      html  css  js  c++  java
  • 多线程坑及预防

    今天开发组内进行经验交流,一个前辈做的多线程开发讲解让我获益匪浅。

    案例一:做一个定时发送的程序,从数据库中获取复合要求的用户数据,向用户发送信息。程序连续运行一个月都正常,在一个统计周期的最后一天,所有用户都收到了短信,造成了极其恶劣的影响。经过重重排查,发现问题出现在这样一段简单的代码上:

    1 public class Utils{
    2     
    3     private static SimpleDateFormate sdf = new SimpleDateFormate();
    4     
    5     public static void do{
    6         ......
    7     }
    8 } 

    一段常见的代码,声明静态的SimpleDateFormate 类来减少虚拟机开销。但是这也是问题所在:SimpleDateFormate 是线程不安全的,当多线程调用该工具类时,SimpleDateFormate类被多个线程读写,其中的值没有被保护,出现错误。

    解决办法:

    (1)多线程情况下为每个线程创建线程不安全的类的对象,对这段代码,把SimpleDateFormate 放到do()方法里。

    (2)用ThreadLocal类修饰。推荐使用,减少对象的创建。

    案例二:使用线程池创建多线程任务,并通过匿名内部类写任务。通过循环依次创建线程任务,

     这个代码实在是找不到了,直接写结论吧:

    多个线程共同使用一个HashMap对象,对其进行读写操作,出现问题。HashMap对象不是线程安全的,HashTable才是。

    预防措施:

    1.避免并发读写

    2.避免不了,加锁同步(悲观锁)

    3.原子类

    Java高并发编程:原子类

    仅凭这一点分享掌握并发编程技巧是不可能的,但他给我指明了一个技术方向,注重并发编程的学习,先淘本书来系统的学习。

  • 相关阅读:
    git 问题集
    es7集群安装配置及常用命令
    idea maven项目操作kafka--生产者和消费者
    linux中kafka集群搭建及常用命令
    xampp 支持php版本,支持php5.2的最后一版xampp——xampp-1.7.1
    TCP和UDP的区别及各自优缺点区别
    Qt容器(QHash/QMap等)基本学习记录
    linux系统剪切
    简单网络IP探索
    C++(Qt)线程与锁
  • 原文地址:https://www.cnblogs.com/cxy2016/p/9230685.html
Copyright © 2011-2022 走看看