
多线程
文章平均质量分 80
jep1983
这个作者很懒,什么都没留下…
展开
-
Java多线程编程总结
http://lavasoft.blog.51cto.com/62575/27069/原创 2012-03-05 20:18:40 · 75 阅读 · 0 评论 -
并发编程陷阱系列 (一)同步不完全
同步块未覆盖到所有场景。 import java.util.HashMap;import java.util.Map;public class CacheManage { private Map<String, String> cache = new HashMap<String, String>(); public static int...原创 2013-04-02 10:24:21 · 156 阅读 · 0 评论 -
并发编程陷阱系列 (二)InterruptException无处不在
当一个方法抛出 InterruptedException 时,它是在告诉您,如果执行该方法的线程被中断,它将尝试停止它正在做的事情而提前返回,并通过抛出 InterruptedException 表明它提前返回。一旦你catch了中断异常,默认你就会处理它,所以JVM会清除中断状态,以防止方法退出后上层调用代码再处理一次异常。如果你只是简单地catch住,并不打算处理,那么就需要恢复被清除...原创 2013-04-02 10:25:32 · 326 阅读 · 0 评论 -
并发编程陷阱系列(三)使用Thread.interrupt()中断线程
Thread.interrupt()方法不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出 阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join,Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。 建议使用外部的...原创 2013-04-02 10:26:32 · 566 阅读 · 0 评论 -
并发编程陷阱系列(四)volatile与变量脏读
预备知识:每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量的值,在修改完之后的某一个时刻(线程退出之前),自动把线程变量副本的值回写到对象在堆中变量。这样在堆...原创 2013-04-02 10:27:01 · 625 阅读 · 0 评论 -
并发编程陷阱系列(五)double check
public static Singleton getInstance(){ if (instance == null) { synchronized(Singleton.class) { //1 if (instance == null) //2 instance = new Singleton(); //3...原创 2013-04-02 10:28:17 · 165 阅读 · 0 评论 -
并发编程陷阱系列(六)高并发环境下使用性能较低的Map
hashtable是线程安全的,但为了保障线程安全,get, put, contains等多个方法都被添加了synchronized,源码片段如下: public synchronized V get(Object key) { Entry tab[] = table; int hash = key.hashCode(); int index = (hash & 0...原创 2013-04-25 21:02:03 · 231 阅读 · 0 评论 -
并发编程陷阱系列(七)读多写少使用synchronized导致性能下降
对并发读的情况进行测试:public class SynchronizedDemo { static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static void main(String[] args) throws Exception { Data data ...原创 2013-05-07 19:19:28 · 413 阅读 · 0 评论 -
并发编程陷阱系列(八)不要吞食CountDownLatch的线程异常
之前的文章中已经介绍了无处不在的InterruptedException的处理方式了,使用CountDownLatch也会有类似的问题(正确的处理方式见下面代码: Thread.currentThread().interrupt()),顺便复习下CountDownLatch的使用方法。 在一些应用中,有多个线程,某个线程会在其他线程执行完毕之后才开始执行。比如,想象有一个程序先下...原创 2013-05-23 19:58:49 · 1871 阅读 · 0 评论