
Java多线程
文章平均质量分 94
Daria_
这个作者很懒,什么都没留下…
展开
-
线程状态和生命周期
一、线程状态线程在生命周期中可以处于下列状态之一,对应于java.lang.Thread.State枚举新建状态(new):用new语句创建的线程处于新建状态,尚未启动,此时它和其他Java对象一样,仅仅在堆区中被分配了内存;就绪状态(Runnable) :当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态,Java虚拟机会为它创建方法调用栈和程序计数器。...原创 2019-04-10 23:39:46 · 253 阅读 · 0 评论 -
LinkedBolckingQueue
LinkedBolckingQueue LinkedBlockingQueue是一个用链表实现的有界阻塞队列。此队列的默认和最大长度为Integer.MAX_VALUE。此队列按照先进先出的原则对元素进行排序。原理: LinkedBlockingQueue底层维持着两把锁,putLock用于put操作添加元素,takeLock用于take操作移除元素,同一时刻只能有一个线程进行put操作...原创 2019-04-25 00:15:39 · 520 阅读 · 0 评论 -
ArrayBlockingQueue
ArrayBolckingQueue ArrayBlockingQueue是一个用数组实现的有界阻塞队列。此队列按照先进先出(FIFO)的原则对元素进行排序。 ArrayBlockingQueue内部只有一把锁,就是说同一时刻只能有一个线程可以进行put或者take操作。 默认情况下不保证线程公平的访问队列,所谓公平访问队列是指阻塞的线程,可以按照阻塞的先后顺序访问队列,即先阻塞线程先...原创 2019-04-25 00:15:17 · 413 阅读 · 0 评论 -
阻塞队列---BlockingQueue
BlockingQueue1、BlockingQueue类的结构2、继承关系public interface BlockingQueue<E> extends Queue<E> BlockingQueue继承自Queue接口,在此基础上增加了阻塞操作,可以支持两个附加操作:支持阻塞的加入方法:在队列满的时候添加元素会被阻塞,直至队列可以添加成功才返回(put(...原创 2019-04-24 23:26:19 · 192 阅读 · 0 评论 -
线程间通信
引入:每个线程都拥有自己独立的栈空间,从线程被启动到终止,如果每个运行中的线程都是独立的运行那只能带来很少的价值,我们需要多个线程彼此之间相互协作的来完成工作一、等待/通知机制 等待和通知的相关方法是任意Java对象都具备的,这些方法被定义在所有方法的超类java.lang.Object上;方法名称描述wait()调用该方法的线程进入WAITING状态,只有等待另外线...原创 2019-04-24 18:15:38 · 272 阅读 · 0 评论 -
Synchronized关键字
一、线程同步 线程同步:当两个或两个以上线程访问同一资源时,需要某种方式来确保资源在某一时刻只被一个线程使用; 处理多线程问题时,多个线程访问同一个对象,并且某些线程还想修改这个对象,这时候就需要用到线程同步,线程同步其实就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面的线程使用完毕后,下一个线程再使用; 由于同一进程的多个线程共享同一块存储空间,在...原创 2019-04-19 17:23:25 · 391 阅读 · 0 评论 -
重入锁ReentrantLock
一、ReentrantLock 重入锁ReentrantLock,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。在同步器中,当一个线程调用Mutex的lock()方法获取锁之后,如果再次调用lock()方法,则该线程将会被自己所阻塞,原因是Mutex在实现tryAcquire(int acquires)方法时没有考虑占有锁的线程再次获取锁的场景,而在调用try...原创 2019-04-23 14:00:53 · 233 阅读 · 1 评论 -
锁的升级与对比
为减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”,在JavaSE 1.6中,锁一共有4中状态,级别从高到低依次是:无锁状态–>偏向锁状态–>轻量级锁状态–>重量级锁状态,这几个状态会随着竞争逐渐升级。注意:锁只可以升级,但不能降级,即轻量级锁升级为重量级锁后不能再降级为轻量级锁;这种锁只能升级不能降级的策略,目的是为了提高获得锁和释放锁的效率;一...原创 2019-04-22 23:55:05 · 233 阅读 · 0 评论 -
Java对象头
一、Java对象头锁存在Java对象头中,如果对象是数组类型,则虚拟机用3个字宽(Word)存储对象头,如果对象是非数组类型,则用2字宽存储对象头。在32位虚拟机中,1字宽等于4字节,即32bit如果对象是数组类型,则虚拟机用3个字宽(Word)存储对象头,如果对象是非数组类型,则用2字宽存储对象头。在32位虚拟机中,1字宽等于4字节,即32bit...原创 2019-04-22 23:30:44 · 227 阅读 · 0 评论 -
ConcurrentHashMap
ConcurrentHashMap是线程安全且高效的HashMap,不了解HashMap的童鞋可以戳这篇文章HashMap源码解析(JDK 1.7)一、使用ConcurrentHashMap的原因1、 HashMap不能搞保证线程安全,在并发编程中使用HashMap进行put操作会导致程序进入死循环 多线程会导致HashMap中的Entry形成环形链表,那么Entry.next永远不为nu...原创 2019-04-26 13:22:20 · 411 阅读 · 0 评论 -
CAS
CAS(compare and swap):Java中通过循环CAS的方式来实现原子操作一、乐观锁和悲观锁1. 悲观锁: 总假设是最坏的情况,每次对数据的操作都会担心数据被其他线程修改(不一定会被修改),所以在每次操作时都需要加锁操作,只有获取锁的线程才能操作该数据,当其他线程想要,操作该数据就会被阻塞(synchronized锁是悲观锁的体现)点击synchronized关键字;使...原创 2019-04-20 19:26:57 · 229 阅读 · 0 评论 -
原子操作
一、原子操作1. 定义 原子(atomic)本意是"不能被进一步分割的最小粒子",而原子操作(atomic operation)意为“不可被中断的一个或一系列操作”。在多处理器上实现原子操作就变得有点复杂。2. 处理器如何实现原子操作1)使用总线锁保证原子性 总线锁就是使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该处理器可以...原创 2019-04-20 18:36:14 · 1392 阅读 · 0 评论 -
volatile关键字
一、先看一个例子:统计一秒内可以进行多少次加操作public class TestVolatile { static boolean flag = false; static class subThread extends Thread { @Override public void run() { System.out.p...原创 2019-04-16 15:36:10 · 220 阅读 · 0 评论 -
线程控制方法
线程的常用方法Thread t = new Thread(); 1. 启动线程 shart()t.stat(); //启动线程2. 停止线程注意:不建议使用stop()和destory()方法(已过时),调用其可能会产生不可预料的结果;线程停止有两种情况:线程体执行结束时线程结束;人为干预,典型做法是提供一个boolean类型的终止变量,当这个变量置为false,终止线...原创 2019-04-15 18:03:17 · 838 阅读 · 0 评论 -
线程的创建以及常用的方法
一、创建线程的方式有以下三种:继承Thread类实现Runnable接口 少用继承多用实现实现Callable接口1. 继承Thread类的方式创建新线程创建自定义的类继承Thread类,并且重写方法;实例化自定义类;通过实例化对象调用start方法,来创建新线;public class ExtendsThread extends Thread...原创 2019-04-02 18:53:49 · 253 阅读 · 0 评论 -
进程与线程
一、进程与线程1. 先看下概念进程:是资源进行分配的单位,是具有一定独立功能的程序关于某个数据集合上的一次运行活动,换句话说,在操作系统中运行中的程序就是进程;线程:是进行资源调度和执行的单位 ;2. 进程与线程的区别区别进程线程根本区别作为资源分配的单位调度和执行的单位开销每个进程都有独立的代码和数据空间,进程间的切换会有较大的开销线程可以看成...原创 2019-04-02 00:20:21 · 203 阅读 · 0 评论 -
线程池
一、为什么要有线程池 使用线程的时候就去创建一个线程,这样很方便,但是如果并发数量很多,每一个线程都是经过短暂的使用就结束,这样频繁的创建和销毁线程需要时间,就会降低系统的效率; 为了减少创建和销毁线程的次数,让每个线程可以多次使用,线程池可以使线程得以复用,在执行完一个任务之后不被销毁,而是可以继续执行其他任务,这样可以根据系统情况调整执行的线程数量,防止消耗过多内存。优点:降低资...原创 2019-05-09 00:39:18 · 229 阅读 · 0 评论