随笔分类 - Java多线程
摘要:1. 为什么要使用线程池 线程是很占用系统资源的,对线程管理不善很容易导致系统问题。因此,我们最好使用线程池来管理线程,使用线程池主要有如下好处: 降低资源消耗。通过复用线程可以降低线程关闭的次数,从而尽可能降低系统性能损耗; 提升系统响应速度。通过复用线程,省去创建线程的过程,从而提升系统的响应速
阅读全文
摘要:锁的状态 锁一共有四种状态(由低到高的次序):无锁状态,偏向锁状态,轻量级锁状态,重量级锁状态锁的等级只可以升级,不可以降级。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率。 偏向锁 大多数情况下,锁不仅不存在多线程竞争,而且总是由同一个线程多次获得,为了让线程获得所得代价更低,引入
阅读全文
摘要:锁削除 锁削除是指虚拟机即时编译器在运行时,对一些代码上要求同步,但是被检测到不可能存在共享数据竞争的锁进行削除。锁削除的主要判定依据来源于逃逸分析的数据支持,如果判断到一段代码中,在堆上的所有数据都不会逃逸出去被其他线程访问到,那就可以把它们当作栈上数据对待, 认为它们是线程私有的,同步加锁自然就
阅读全文
摘要:多线程对性能最大的影响是阻塞,挂起线程和恢复线程的操作都需要转入内核态中完成,这个过程时需要消耗系统资源的。实际上,许多应用的共享数据的锁定状态只会持续很短的时间,为了这段时间去挂起和恢复线程并不值得。于是,我们可以让后面请求锁的线程“稍等一会”,等待持有锁的线程会不会很快就释放了锁。为了让线程在原
阅读全文
摘要:synchronized是一种独占式的重量级锁,在运行到同步方法或者同步代码块的时候,让程序的运行级别由用户态切换到内核态,把所有线程挂起,通过操作系统的指令,去调度线程。这样会频繁出现程序运行状态的切换,会消耗系统资源。 synchronized实现原理 synchronized是在jvm中实现的
阅读全文
摘要:一、AQS介绍 AQS,即AbstractQueuedSynchronizer, 抽象队列同步器,它是Java多线程模块用来构建锁和其他同步组件的基础框架。来看下同步组件对AQS的使用: AQS是一个抽象类,主是是以继承的方式使用。AQS本身是没有实现任何同步接口的,它仅仅只是定义了同步状态的获取和
阅读全文
摘要:用法:ThreadLocal用于保存某个线程共享变量:对于同一个static ThreadLocal,不同线程只能从中get,set,remove自己的变量,而不会影响其他线程的变量。 ThreadLocal.get: 获取ThreadLocal中当前线程共享变量的值。 ThreadLocal.se
阅读全文
摘要:作用我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁
阅读全文
摘要:Master-Worker模式是常用的并行模式之一,它的核心思想是:系统由Master进程和Worker进程两类进程协同工作,Master负责接收和分配任务,Wroker负责处理子任务。当各个Worker进程将子任务处理完成后,将结果返回给Master进程,由Master进程进行汇总,从而得到最终的
阅读全文
摘要:Future模式的核心:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑。 Future模式有点类似于商品订单。在网上购物时,提交订单后,在收货的这段时间里无需一直在家里等候,可以先干别的事情。类推到程序设计中时,当提交请求时,期望得到答复时,如果这个答复可能很慢。传统的是
阅读全文
摘要:ConcurrentHashMap HashMap是线程不安全的,可以使用Collections.synchronizedMap(map)把一个不安全的map变成安全的,但是这里可以直接使用ConcurrentHashMap。 ConcurrentHashMap是线程安全的的Hash表。对于多线程的
阅读全文
摘要:在前面我们提到了阻塞队列,也用过了LinkedBolckingQueue队列了,在这里,我们主要对 ArrayBlockingQueue,PriorityBlockingQueue,DelayQueue,SynchronousQueue,LinkedTransferQueue,LinkedBlock
阅读全文
摘要:CyclicBarrier概念:CyclicBarrier是多线程中的一个同步工具,它允许一组线程互相等待,直到到达某个公共屏障点。形象点儿说,CyclicBarrier就是一个屏障,要求这一组线程中的每一个线程都要等待其他的线程执行完成,即这一组线程全部来到屏障前(全部执行完成),屏障才会打开,放
阅读全文
摘要:概念:CountDownLatch是多线程里面一个类似于计数器的高级同步工具,它的初始值代表线程的数量,当一个线程完成了任务后,CountDownLatch的值就减1,当值为0的时候,代表所有线程完成了任务,然后等待的线程可以开始自己的任务。 方法:这里主要涉及到两个核心的方法: await():线
阅读全文
摘要:概念: Semaphore是信号量,又称为信号灯,它可以控制某个共享资源可被同时访问的次数,即可以维护当前访问某一共享资源的线程个数,并提供了同步机制。当Semaphore的个数变成1时,即代表只允许一个线程访问,这是Semaphore的功能就变成了Lock的功能。 它有两个核心方法: acquir
阅读全文
摘要:ReentrantLock是重入锁,它与synchronized很像,它是synchronized的加强版,因为它具有一些synchronized没有的功能。下面我们看看两者的区别:synchronized具有一定的局限性: 当线程尝试获取锁的时候,如果获取不到锁会一直阻塞; 如果获取锁的线程进入休
阅读全文
摘要:CAS算法概述CAS是英文单词CompareAndSwap的缩写,中文意思是:比较并替换。CAS需要有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。 CAS指令执行时,当且仅当内存地址V的值与预期值A相等时,将内存地址V的值修改为B,否则就什么都不做。整个比较并替换的操作是一个原子操作
阅读全文
摘要:1.什么是Atomic?Atomic,中文意思是“原子的”,在java多线程中,有这样的一个包: java.util.concurrent.atomic——线程安全的原子操作包 这是JDK1.5的版本中为我们提供的原子操作包。所谓“原子”操作,是指一组不可分割的操作,操作者对目标对象进行操作时,要么
阅读全文
摘要:在我的上一条博客中,已经介绍到了多线程的经典案列——生产者消费者模式,但是在上篇中用的是传统的麻烦的非阻塞队列实现的。在这篇博客中我将介绍另一种方式就是:用阻塞队列完成生产者消费者模式,可以使用多种阻塞队列,这里最好使用LinkedBlockingQueue 下面请看代码: 结果输出: 总结一下:
阅读全文
摘要:生产者消费者模型 具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品。生产消费者模式如下图。(图片来自网络,侵删!) 生产者消费者模型的实现 生产者是一堆线程,消费者是另一堆线程,内存缓冲区可以使用List数组队列,数
阅读全文