zoukankan      html  css  js  c++  java
  • Anti Pattern

    In a previous post, I wrote the usage and benefits of ThreadLocal based instance variables in concurrent applications. This seemingly innocent and fail-proof implementation will provide clear data separation and visibility between threads in multi-threaded applications UNTIL, you use Thread Pooling.
     
    ThreadLocal variables as the name suggest is local to the thread, til the thread is alive the ThreadLocal instance variable can not be Garbage Collected. This post explains the theory clearly.
     
    To see it in action I wrote a small program which infinitely creates Tasks in one implementation submitting tasks to a Thread Pool and in another instance creating ad-hoc Threads which are no pooled. And I used jVisualVM to monitor the VM.
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    
    public class ThreadLocalTest {
    
        private static ExecutorService executor = Executors.newFixedThreadPool(100);
        
        public static void main(String[] args) {
            while(true) {
                // Thread Pooled based implementation
                executor.execute(new SimpleThread());
                // Ad-hoc Thread based implementation
                new SimpleThread().start();
            }
        }
        
        public static class SimpleThread extends Thread {
            
            private ThreadLocal<Integer> no = new ThreadLocal<Integer>() {
    
                @Override
                protected Integer initialValue() {
                    return 0;
                }
                
            };
            
            public void run() {
                while(no.get() < 100) {
                    no.set(no.get() + 1);
                }
                System.out.println(String.format("Thread : %s Finished", Thread.currentThread().getName()));
                no.remove();
            }
        }
    }
    In the Thread pooled implementation one thread throwing an Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "Thread Name" is just a matter of time.
     
    Where as the adhoc Thread creation seems to keep on running with good VM Garbage Collection but the Thread pool implementation fills up the heap space within minutes and eventually runs out of memory. 
     
    Lesson
     
    Always keep an eye on the Thread classes you use in your application, make sure they don't have ThreadLocal variables when you are using Thread Pooling.

    Give special care when you get pre-compiled third-party libraries which might have ThreadLocal so always read javadocs thoroughly when you use Thread pooling.

     转载自:http://shazsterblog.blogspot.com/2015/01/anti-pattern-threadlocal-variables-with.html

  • 相关阅读:
    最近的题越来越难了,卧槽,搞一上午一题不会,题解也看不懂
    hdu 4630 树状数组 ****
    hdu 3473 划分树 ***
    hdu 3360 最小点覆盖 **
    hdu 1507 记录路径的二分匹配 **
    poj 3177 边双联通 **
    hdu 4612 边双联通 ***
    Elasticsearch聚合后分页深入详解
    redis 五种数据类型及其使用场景
    再有人问你分布式锁,这篇文章扔给他
  • 原文地址:https://www.cnblogs.com/passedbylove/p/11846627.html
Copyright © 2011-2022 走看看