多线程坑及预防
今天开发组内进行经验交流,一个前辈做的多线程开发讲解让我获益匪浅。
案例一:做一个定时发送的程序,从数据库中获取复合要求的用户数据,向用户发送信息。程序连续运行一个月都正常,在一个统计周期的最后一天,所有用户都收到了短信,造成了极其恶劣的影响。经过重重排查,发现问题出现在这样一段简单的代码上:
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高并发编程:原子类
仅凭这一点分享掌握并发编程技巧是不可能的,但他给我指明了一个技术方向,注重并发编程的学习,先淘本书来系统的学习。