多线程
中都
风习袅袅,盈水展千华,飞檐亭角清铃响;犹记当初,你回眸莞尔,一笑倾城百日香。!
展开
-
多线程(九)—— 阻塞队列
目录什么是阻塞队列阻塞队列源码1、ArrayBlockingQueue源码2、LinkedBlockingQueue源码 什么是阻塞队列 阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样...原创 2018-08-21 10:25:16 · 872 阅读 · 0 评论 -
多线程(十一)—— 死锁
目录死锁死锁产生原因:出现死锁的必要条件:死锁的预防或解除1、预防死锁(破坏4个必要条件)2、避免死锁(银行家算法)3、检测与接触死锁4、如何检查程序中的死锁? 死锁 死锁是指两个或者两个以上的线程在执行过程中,由于竞争资源而造成的阻塞问题,若无外力作用下,他们将无法推进下去。此时系统处于死锁状态 死锁产生原因: 1、因竞争资源产生死锁 2、进程顺序推进不当发生死锁 出现死锁的必要条件: 1、互斥...原创 2018-08-27 08:29:49 · 435 阅读 · 0 评论 -
多线程 (八)—— Condition
我们从Condition对象的创建开始: Condition对象是通过ReentrantLock对象的newCondition()方法来创建的: 下面就来看看ConditionObject类的源码: 下来主要看有关通信的三个方法await()、signal()、signalAll()方法,其他方法调用的时候再看; 总结一下就是: 1、await的过程如下: ①将当前线程加入等待队列(等...原创 2018-08-21 08:02:25 · 388 阅读 · 0 评论 -
多线程(七)—— ReentrantLock源码解析
目录可重入锁有两种实现方式 :一、AbstractQueuedSynchronizer源码解析1、继承关系2、构造函数3、属性二、ReentrantLock源码解析1、继承关系2、构造函数3、属性和内部类Sync类源码(公平锁和非公平锁的父类):NonfairSync(非公平性锁)源码:FairSync(公平性锁)源码4、方法 可重入锁有两种实现方式 : 1、公平锁:先来后到,先来抢锁的线程先执行...原创 2018-08-20 17:00:22 · 1204 阅读 · 0 评论 -
多线程(六)——锁
目录锁的种类1、乐观锁CAS机制(也叫无锁编程):2、悲观锁3、偏向锁4、轻量级锁5、可重入锁6、可中断锁7、限时锁: 锁的种类 1、乐观锁 乐观锁、悲观锁都是一种理论锁,具体的实现还是靠那些实质的锁实现的。 特性:每次对数据操作的时候都不担心数据被修改,当数据进行读取操作的时候,不需要加锁,当更新数据时,需要判断数据是否被修改,未被修改时则可以直接更新(CAS机制就是乐观锁的体现); 缺点:也...原创 2018-08-20 07:59:11 · 725 阅读 · 0 评论 -
多线程(五)—— 原子更新操作类
原子类(jdk1.5操出现的)提供原子操作,主要分为以下四类: 原子更新基本类型 原子更新数组 原子更新抽象类型 原子更新字段 1、原子更新操作类 AtomicInteger(int)、AtomicLong(long)、AtomicBoolean(boolean); 他们提供的方法基本一致: 方法 作用 int addAndGet(int delta) 以原子方式将输入的数值与...原创 2018-08-19 11:16:14 · 593 阅读 · 0 评论 -
多线程(四)——线程的同步和通信
目录一、线程同步二、线程的通信wait()方法和notify()或notifyAll() 线程安全是指多个线程访问同一代码,不会产生不确定的结果; 一、线程同步 为了避免多线程在共享资源时发生冲突,所以 要在线程使用该资源时,就为线程上一把“锁”,第一个访问资源的线程为资源上锁,其他线程若想访问该资源,则必须等待解锁为止,解锁的同时,另一个线程访问资源并为资源上锁。 在使用多线程编程时,一般解决同...原创 2018-08-19 08:19:43 · 720 阅读 · 0 评论 -
多线程(一)——线程的概念和线程的创建
目录1、什么是线程?它与进程有什么区别?为什么要使用多线程?2、如何实现多线程? 1、什么是线程?它与进程有什么区别?为什么要使用多线程? ①线程是指程序在执行过程中,能够执行程序代码的一个执行单元(程序执行一般以进程为单位,线程是程序执行的最小单元)(线程有三种状态:就绪、运行、阻塞); ②进程指一段正在执行的程序,一个进程可以拥有多个线程,各个线程之间共享程序的内存空间(代码段、数据段和堆空间...原创 2018-08-13 17:38:47 · 326 阅读 · 0 评论 -
多线程(二)——线程的状态和线程操作的相关方法
目录1、线程状态2、线程操作的相关方法 1、线程状态 线程状态:6种 线程状态(英文) 线程状态 NEW 新建状态 RUNNABLE 可运行状态(就绪状态) TIMED_WAITING 睡眠状态 BLOCKED 阻塞状态 WAITING 等待状态 TERMINATED 终止状态(死亡状态) 线程的状态转换图: 2、线程操作的相关方法 方法名 作用...原创 2018-08-14 08:30:38 · 583 阅读 · 0 评论 -
多线程(三)——run()方法和start()方法的区别
线程的run()方法是由java虚拟机直接调用的,如果我们没有启动线程(没有调用线程的start()方法)而是在应用代码中直接调用run()方法,那么这个线程的run()方法其实运行在当前线程(即run()方法的调用方所在的线程)之中,而不是运行在其自身的线程中,从而违背了创建线程的初衷; 下面是一个用来说明start()方法和run()方法的区别的实例: public class WelcomT...原创 2018-08-17 09:18:41 · 23908 阅读 · 7 评论 -
多线程(十)—— ConcurrentHashMap源码解析
目录ConcurrentHashMap的特点:线程安全ConcurrentHashMap JDK1.7源码解析:1、继承关系2、属性和主要构造方法3、重要方法ConcurrentHashMap 在JDK 1.7个JDK 1.8上的不同点: ConcurrentHashMap的特点:线程安全 ConcurrentHashMap底层数据结构:数组+数组+链表(可以理解就是一个存储HashMap元素的...原创 2018-08-21 20:44:28 · 1134 阅读 · 0 评论 -
多线程(十二)—— 线程池
目录1、为什么要有线程池2、线程池类的继承关系3、ThreadPollExecutor源码解析:4、线程池执行过程5、Executors静态工厂里的线程池 1、为什么要有线程池 优点: ①避免大量线程之间相互的抢占资源导致的阻塞现象 ②减少线程的创建和销毁带来的开销提升性能 ③提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行 ④提高线程的可管理性。线程是稀缺资源,如果无限制的创...原创 2018-08-27 09:32:58 · 714 阅读 · 0 评论