多线程坑及预防

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

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

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高并发编程:原子类

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

原文地址:https://www.cnblogs.com/cxy2016/p/9230685.html