线程池,单例模式

javac SynchronizedDemo.java 命令生成编译后的 .class 文件
javap -c -s -v -l SynchronizedDemo.class

wait会把锁释放掉
单例模式需要把那个变量volatile,然后在getXXX方法里面先判null,这个依然不好,在new之前在加锁判断是否null
工厂模式的意义就是使用一个类来生成实现了某个接口的各种类


ThreadLocalMap 中使用的 key 为 ThreadLocal 的弱引用,而 value 是强引用。所以,如果 ThreadLocal 没有被外部强引用的情况下,在垃圾回收的时候会 key 会被清理掉,而 value 不会被清理掉。这样一来,ThreadLocalMap 中就会出现key为null的Entry。假如我们不做任何措施的话,value 永远无法被GC 回收,这个时候就可能会产生内存泄露。ThreadLocalMap实现中已经考虑了这种情况,在调用 set()、get()、remove() 方法的时候,会清理掉 key 为 null 的记录。使用完 ThreadLocal方法后 最好手动调用remove()方法


《阿里巴巴Java开发手册》中强制线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险


判断是否创建thread的顺序是    coreNumber, queue是否满, max是否到,如果到了max则拒绝
如果线程池当前拥有超过corePoolSize的线程,那么多余的线程在空闲时间超过keepAliveTime时会被终止 ( 请参阅getKeepAliveTime(TimeUnit) )。这提供了一种在不积极使用线程池时减少资源消耗的方法。
如果池在以后变得更加活跃,则应构建新线程。 也可以使用方法setKeepAliveTime(long,TimeUnit)进行动态调整。

 

 

ExecutorService es = Executors.newFixedThreadPool(4);
ExecutorService es1 = Executors.newCachedThreadPool();
ExecutorService es2 = Executors.newScheduledThreadPool(4);
ExecutorService es3 = Executors.newSingleThreadExecutor();

ExecutorService es4 = new ThreadPoolExecutor(1, 1,
        0L, TimeUnit.MILLISECONDS,
        new LinkedBlockingQueue());

你可能感兴趣的:(线程池,单例模式)