摘要: 1.强引用 以前我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。 阅读全文
posted @ 2016-12-22 18:14 Darcy_wang 阅读(226) 评论(0) 推荐(0) 编辑
摘要: 为每一个线程分配一个独立的对象对系统性能也许是有帮助的,当然了,这也不一定,这完全取决于共享对象的内部逻辑,如果共享对象对于竞争的处理容易引起性能损失,我们还是考虑使用ThreadLocal为每一个线程分配单独的对象.一个经典的案例就是在多线程下产生随机数: public class RandomD 阅读全文
posted @ 2016-12-22 18:12 Darcy_wang 阅读(252) 评论(0) 推荐(0) 编辑
摘要: ThreadLocal的set方法和get方法,从set方法开始: public void set(T value) { Thread t = Thread.currentThread();//获取当前线程 ThreadLocalMap map = getMap(t);//获取线程的局部变量 if 阅读全文
posted @ 2016-12-22 18:10 Darcy_wang 阅读(267) 评论(0) 推荐(0) 编辑
摘要: 从ThreadLocal的名字上可以看到,这是一个线程局部变量,也就是说,只有当前线程可以访问,既然是只有当前线程可以访问的数据,自然是线程安全的. public class ThreadLocalDemo { private static ThreadLocal<SimpleDateFormat> 阅读全文
posted @ 2016-12-22 18:05 Darcy_wang 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 有助于提高锁性能的几点建议 减少锁的持有时间 真正需要同步加锁的时候在加锁,减少锁的持有时间有助于减低锁冲突的可能性,进而提升系统的并发能力, 减少颗粒度,所谓减少颗粒度就是指缩小锁定对象的范围,从而减少锁冲突的可能性,进而提升系统的并发能力,问题在于类似于size()获取全局信息的方法调用并不频繁 阅读全文
posted @ 2016-12-22 18:02 Darcy_wang 阅读(298) 评论(0) 推荐(0) 编辑
摘要: 锁偏向 是一种加锁操作的优化手段,他的核心思想是:如果一个线程获得了锁,那么就进入偏向模式,当这个线程再次请求锁时,无须在做任何同步操作,因此在几乎没有锁竞争的场合,偏向锁是比较好的优化效果,因为连续多次极有可能是同一个线程请求同一个相同的锁,对于锁竞争比较激烈的场合,其效果不佳,因为竞争激烈的场合 阅读全文
posted @ 2016-12-22 18:02 Darcy_wang 阅读(325) 评论(0) 推荐(0) 编辑
摘要: 多线程的软件设计方法确实可以最大限度的发挥现代多核心处理器的计算能力,提高生产系统的吞吐量和性能,但是若不加控制和管理的随意使用线程,对熊的性能反而产生了不力的影响. 在实际生产环境中,线程的数量必须得到控制,盲目的大量创建线程对系统性能是有伤害的. 什么是线程池: 为了避免系统频繁的创建和销毁线程 阅读全文
posted @ 2016-12-22 17:49 Darcy_wang 阅读(2507) 评论(0) 推荐(0) 编辑
摘要: 对于核心的几个线程池,无论是newFixedThreadPool()方法,newSingleThreadExecutor()还是newCachedThreadPool()方法,虽然看起来创建的线程有着完全不同的功能特点,但其内部实现均使用了ThreadPoolExecutor实现,下面给出了三个线程 阅读全文
posted @ 2016-12-22 17:43 Darcy_wang 阅读(388) 评论(0) 推荐(0) 编辑
摘要: 他可以在线程任意位置让线程阻塞, LockSupport的静态方法park()可以阻塞当前线程,类似的还有parkNanos() ParkUntil()等,他们实现了一个限时等待 public class LockSupportDemo { public static Object u = new 阅读全文
posted @ 2016-12-22 17:40 Darcy_wang 阅读(740) 评论(0) 推荐(0) 编辑
摘要: 可以理解为循环栅栏,栅栏就是一种障碍物.假如我们将计数器设置为10,那么凑齐第一批10个线程后,计数器就会归零,然后接着凑齐下一批10个线程,这就是循环栅栏的含义. 构造器: public CyclicBarrier(int parties, Runnable barrierAction) part 阅读全文
posted @ 2016-12-22 17:38 Darcy_wang 阅读(2429) 评论(1) 推荐(1) 编辑
摘要: 这是一个非常实用的多线程控制工具类,经典的场景就是 火箭发射,在火箭发射前,为了保证万无一失,往往还要进行各项设备,仪器的检查,只有等待所有的检查完毕后,引擎才能点火, CountDownLatch构造器接受一个整数作为参数,即当前这个计数器的计数个数. public CountDownLatch( 阅读全文
posted @ 2016-12-22 17:36 Darcy_wang 阅读(405) 评论(0) 推荐(0) 编辑
摘要: 读写分离锁可以有效的帮助减少锁的竞争,提升系统的效率, 读-读不互斥 读读之间不阻塞 读-写互斥 读阻塞写,写也会阻塞读 写-写互斥 写写阻塞 在系统中,读操作次数远远大于写操作,则读写锁就可以发挥最大的功效,提升系统的性能. public class ReadWriteLockDemo { pri 阅读全文
posted @ 2016-12-22 17:34 Darcy_wang 阅读(304) 评论(0) 推荐(0) 编辑
摘要: 信号量为多线程协作提供了更为强大的控制方法,广义上说,信号量是对锁的拓展,无论是内部锁synchronized还是重入锁ReentrantLock,一次都只允许一个线程访问一个资源,而信号量缺可以指定多个线程.同时访问某一个资源,信号量主要提供了一下构造函数: public Semaphore(in 阅读全文
posted @ 2016-12-22 17:33 Darcy_wang 阅读(1110) 评论(0) 推荐(0) 编辑
摘要: Condition结构提供了基本方法如下: void await() throws InterruptedException; void awaitUninterruptibly(); long awaitNanos(long nanosTimeout) throws InterruptedExce 阅读全文
posted @ 2016-12-22 17:32 Darcy_wang 阅读(815) 评论(0) 推荐(0) 编辑
摘要: 重入锁可以完全代替synchronized关键字.在JDK5.0的早期版本中,重入锁的性能远远好于synchronized,但是从JDK6.0开始.JDK在synchronized上做了大量的优化.使得两者的性能差距不大, public class ReenterLock implements Ru 阅读全文
posted @ 2016-12-22 17:31 Darcy_wang 阅读(764) 评论(0) 推荐(0) 编辑