导航

从业四年看并发

Posted on 2014-01-21 17:09  ghostll  阅读(151)  评论(0编辑  收藏  举报

 本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!

 

从业到现在,一直是看别人的博客,看别人的文章,一直在学习,总结的只是经验性东西,可以复用的,比较深的见解还从未写出来过。今天清英同学号召大家分享并发经验,抛开大家已经写的东西,看看一个从业四年的人是如何看待这个问题的吧!

 

一直写java程序,一开始从基础操作写起,再者功能,再者逻辑,现者算法,慢慢接触到大型项目,并发、多线程、IO操作就开始用的多了。

 

在刚开始,接触到用子线程+handler的方式处理任务,完成后给UI线程提供处理结果,稍后用runonuithead,asynctask比较多,用来处理并发任务,主要是网络数据和大操作数据的处理。

 

上面说的是前台操作,我们再说说后台操作,比如数据库经常性插入删除数据,为了避免对同一个对象进行操作,实现并发,我们会使用synchronized关键字对方法或者资源加锁,一次只处理一个资源,处理完再交给后者;其他也可以使用lock对象,lock和unlock也比较直观;如果可以预知操作时间,也可以通过sleep来处理;或者wait+notify/notifyall,这些对线程进行早期处理的关键字来做。

 

总之并发的原则就跟出火车票一样,出一张少一张,刷验证码时,谁先输谁就获得这张票的lock权限就可以拿到票,另一个人只好“望洋兴叹”了!说到这儿,讲一个趣闻,早期银行卡不同步,导致有人卡里有2000块,一个ATM机取完,然后驱车到另一个城市再取,还可以取到。听到这儿,你是不是想实际操作下,当然不幸的是我知道的这个问题,已经在当时马上被解决。

 

最后像在Android当中,有过这样的场景,后台Service在执行若干条联网线程,此时突然断网,我们需要停止线程的运行。像这样,我们可以使用观察者模式,全局定义一个广播,网络停用会发一个广播给我们,然后在广播中通知Service关闭正在执行的线程。并发因为前台逻辑操作多而产生,因后台资源写入权限唯一而解决。

 

PS:关于容器,同步与并发的概念同时存在,CopyOnWriteArraySet、ConcurrentMap、ConcurrentHashMap,三者都使用了避免ConcurrentModificationException的技术。另外还有常见的HashTable、Vector和StringBuffer,也是实现类似结构,而避免不同步的现象出现。

其他java新特性:java5中提供了AutomicInteger、volatile来保持资源同步,java7中提供了Semaphore来让多个线程同时访问资源,谁先处理完则结束其他,玩的就是硬件+网络处理速度。

我的专栏