多线程-生产者和消费者模式的四种实现

什么是生产者和消费者模式: 生产者和消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此并不直接通信,而是通过阻塞队列进行通信,所以生产者生产完数据后不用等待消费者进行处理,而是直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列中获取数据,阻塞队列就相当于一个缓冲...

2019-05-29 10:29:41

阅读数 4217

评论数 22

多线程-线程按照特定顺序轮询打印

题目: 编写程序,开启三个线程,这三个线程的ID分别是A,B,C,每个线程将自己的ID在屏幕上打印十次,要求输出结果必须按照ABC的顺序显示,如:ABCABCACB… 方法一:指定线程唤醒轮循打印,使用ReentrantLock和Condition。 本方法空间开销较大,因为使用了三个条件对象,但...

2019-05-20 09:45:23

阅读数 33

评论数 0

线程池-Executor框架概述及ThreadPoolExecutor源码详解

为什么要有线程池: 降低资源消耗,通过重复利用已创建的线程来降低线程创建和销毁造成的损耗。 提高响应速度。当任务到达时,任务可以不需要等待线程创建就能直接执行。 提高线程的可管理性。线程是稀缺资源,如果无限制地创建线程,不仅会消耗系统资源,而且会降低系统的稳定性,适用线程池可以统一分配,调优和监...

2019-05-08 17:42:10

阅读数 209

评论数 0

多线程-死锁定位以及如何避免死锁(银行家算法)

什么是死锁: 死锁是指两个或两个以上线程在执行过程中,由于竞争资源而造成的阻塞问题,若无外力作用下,他们将无法推荐下去,此时系统处于死锁状态。 死锁的危害: 导致程序得不到正确的运行结果:因为程序产生死锁,发生阻塞,不会继续向下执行。 浪费资源:产生死锁,最少有两个线程会发生阻塞。 产生新的死锁...

2019-04-28 18:26:38

阅读数 75

评论数 0

多线程-ConcurrentHashMap源码详解

概述: HashMap是集合中最常用的数据结构之一,由于HashMap非线程安全,因此不能用于并发访问场景。在jdk1.5之前,通常使用HashTable作为HashMap的线程安全版本。HashMap对读写操作进行全局加锁,在高并发的条件下会造成严重的锁竞争和等待,极大地降低了系统的吞吐量。 优...

2019-04-26 17:36:01

阅读数 990

评论数 5

多线程-BlockingQueue(ArrayBlockingQueue/LinkedBlockingQueue)源码详解

BlockingQueue(阻塞队列)应用场景: BlockingQueue即阻塞队列是一种将ReentrantLock应用比较精彩的一种表现,它最经典的应用就是实现生产者与消费者模式 ; BlockingQueue接口特点: 不接受null元素,当添加一个null元素时,会抛出NullPo...

2019-04-23 17:52:18

阅读数 192

评论数 0

多线程-ReentrantLock源码分析(公平锁和非公平锁)

什么是公平性锁: 按照线程请求锁的顺序来获取锁。 什么是非公平性锁: 获取锁的线程不是按照先来后到的顺序获取,而是抢夺式获取锁。 ReentrantLock源码分析: 继承关系: ReentrantLock实现了Lock接口。该接口提供了一些通用的加锁解锁操作。 void lock(): 加锁...

2019-04-23 12:23:45

阅读数 41

评论数 0

多线程-AbstractQueueSynchronizer源码详解 (AQS独占锁同步的实现)

什么是公平性锁: 按照线程请求锁的顺序来获取锁。 什么是非公平性锁: 获取锁的线程不是按照先来后到的顺序获取,而是抢夺式获取锁。 AbstractQueueSynchronizer(AQS)源码分析:基于FIFO(先进先出)队列,用于构建锁或者其它相关同步装置的基础框架。 AQS的功能可以分为两大...

2019-04-22 21:05:29

阅读数 37

评论数 0

多线程- Atomic 中的 incrementAndGet与 getAndIncrement 两个方法的区别

int incrementAndGet() 以原子方式将当前值加 1。 int getAndIncrement() 以原子方式将当前值加 1。 再进行源代码查看: public final int getAndIncrement() { for (;;) { int cur...

2019-04-20 17:59:26

阅读数 37

评论数 0

多线程-Executor和几种线程中断操作

Executor(执行器): Executor管理多个异步任务的执行,无需程序员显示地管理线程地生命周期。这里的异步是指多个任务的执行互不干扰,不需要进行同步操作。 主要有三种Executor: **CachedThreadPool

2019-04-18 17:31:22

阅读数 54

评论数 0

多线程-ReentrantLock(可重入锁)与synchronized比较

可重入锁新特征: 可中断响应; 锁限时操作; 公平锁; 非公平锁; 结合Condition使用; 继承关系: Lock定义了锁的接口规范。 ReentrantLock实现了Lock接口。 AbstractQueuedSynchronizer中以队列的形式实现线程之间的同步。 Reentran...

2019-04-18 14:46:00

阅读数 47

评论数 0

多线程-线程状态转换图以及线程状态介绍

线程状态转换图:两幅图仅是表现形式不同; 线程状态转化图一: 线程转换状态图二: 线程的几种状态: 新建状态(New): 用new语句创建的线程处于新建状态,此时它和其它java对象一样,仅仅在堆中分配了内存。 就绪状态(Runnable): 当一个线程对象被创建后,其它线程调用它的st...

2019-04-15 23:43:34

阅读数 52

评论数 0

多线程-锁分类/锁优化(升级)以及锁对比

什么是锁池: 假设线程A已经拥有了某个对象(不是类)的锁,而其它线程想要调用这个对象的某个synchronized方法或者synchronized块,由于这些线程在进入对象的synchronized方法之前必须获得该对象的锁的拥有权。 但是该对象的锁目前正在被线程A拥有,所以这些线程就进入了该对象...

2019-04-14 20:44:08

阅读数 72

评论数 0

多线程-volatile关键字和synchronized关键字详解

在多线程并发编程中synchronized关键字和volatile关键字都有重要意义,volatile是轻量级的synchronized; 加了volatile关键字的变量都属于临界资源; 什么是同步:同一时刻只能有一个线程对资源进行访问; 什么是临界区?什么是临界资源? 临界资源: 是一次 仅...

2019-04-14 12:25:41

阅读数 52

评论数 0

多线程-如何用多线程去并行传输文件

在我们学习IO流时,我们对文件进行传输,其实都是使用的串行传输方式,这种传输方式在传输小文件时性能还是我们可以接受的,但是在传输超大型文件时,这种串行的传输方式就会变得非常低效,因为只有一个线程去抢夺CPU的执行权,其占用的执行时间是非常少的,当我们采用多线程时,其相对的占用CPU执行时间的百分比...

2019-04-10 11:35:58

阅读数 174

评论数 0

多线程-启动线程的几种方式以及Thread类方法详解

线程之间的执行是相互独立的,哪一个线程优先执行取决于OS的调度 线程的创建方式: 实现Runnable接口: 创建自定义类并实现runnable接口,且实现接口中的run方法; 实例化自定义的类; 将自定义类的实例作为参数传给Thread类,创建thread实例; 调用thread实例的star...

2019-03-31 11:15:02

阅读数 86

评论数 0

多线程-进程与线程详解

目录: 什么是进程 什么是线程 线程的好处 进程与线程的关系 进程与线程的区别 java中的main方法是进程还是线程 java内存模型(JMM ( java Memory Model )) 多线程编程的好处 java线程与操作系统之间的关系 进程间通信:共享内存原理 虚拟地址空间 用户空间和内核...

2019-03-30 18:56:43

阅读数 68

评论数 0

提示
确定要删除当前文章?
取消 删除