![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java多线程专题
icoder.long
Change the world with thought and code!
展开
-
Java多线程专题-线程池原理
线程池概念及应用线程池是为了省去频繁创建线程所带来的开销,统一管理线程,在程序一开始就创建一些线程供程序使用,使用完毕后不会结束该线程,而是放回线程池,以便被再次使用,可以理解为线程池是一个线程的集合,每一个线程都可被多次使用。Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。降低资源消耗...原创 2019-06-05 21:06:24 · 153 阅读 · 0 评论 -
Java多线程专题-并发队列
在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列,一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue。ConcurrentLinkedQueue是一个适用于高并发场景下的队列,通过无锁的方式,实现了高并发状态下的高性能,通常ConcurrentLinkedQueue性能好于BlockingQue...原创 2019-06-04 22:19:13 · 218 阅读 · 0 评论 -
Java多线程专题-Countdownlatch、CyclicBarrier与Semaphore
这三个类都属于java.util.concurrent包下的,用于保证线程安全,用比较简明的话讲,这三个类的主要功能为:Countdownlatch:指定数量的线程执行完后才能向下执行。 CyclicBarrier:指定数量的线程到达屏障之后,一起向下执行 Semaphore:只允许指定数量的线程同时执行具体参照下面的详细介绍CountDownLatchCountDownLatc...原创 2019-06-04 22:07:52 · 174 阅读 · 0 评论 -
Java多线程专题-同步容器类之间的线程问题
Vector与ArrayList区别1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。2....原创 2019-06-04 22:02:51 · 156 阅读 · 0 评论 -
Java多线程专题-Lock锁的使用
在 jdk1.5 之后,并发包中新增了 Lock 接口(以及相关实现类)用来实现锁功能,Lock 接口提供了与 synchronized 关键字类似的同步功能,但需要在使用时手动获取锁和释放锁。Lock写法Lock lock = new ReentrantLock();lock.lock();try{//可能会出现线程安全的操作}finally{//一定在finally中释放...原创 2019-06-04 21:57:14 · 455 阅读 · 0 评论 -
Java多线程专题-wait()、notify、notifyAll()方法
wait()、notify()、notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态。这三个方法最终调用的都是jvm级的native方法。随着jvm运行平台的不同可能有些许差异。 如果对象调用了notifyAll方法就会通知所有等待这个对象控制权的线程继续运行。 如果对象调用了notify方法就会通知某个正在等待这个对象的控制权的线程可以继续运行。 如果对象调...原创 2019-06-04 21:51:13 · 309 阅读 · 0 评论 -
Java多线程专题-ThreadLocal
ThreadLocal是线程内部的局部变量,仅提供给当前线程访问,可以在线程运行时随时获取。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。ThreadLocal的接口方法ThreadLocal类接口很简单,只有4个方法,我们先来了解一下:void se...原创 2019-06-04 21:36:37 · 140 阅读 · 0 评论 -
Java多线程专题-volatile的使用
什么是volatileVolatile关键字的作用是保证被修饰的变量在多个线程之间的可见性。并不保证线程安全先来看下面这个例子class ThreadVolatileDemo extends Thread { public boolean flag = true; @Override public void run() { System.out...原创 2019-06-03 21:36:53 · 148 阅读 · 0 评论 -
Java多线程专题-Java内存模型
共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写...原创 2019-06-02 23:39:32 · 149 阅读 · 0 评论 -
Java多线程专题-多线程三大特性
在我们的日常编码中,遵守多线程的三大特性可以使我们的程序更加稳健,避免不必要的麻烦。原子性即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。一个很经典的例子就是银行账户转账问题: 比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元。这2个操作必须要具备原子性才能保证不出现一些意外的问题。我们...原创 2019-06-02 23:37:43 · 268 阅读 · 0 评论 -
Java多线程专题-线程死锁的原因解决方案
死锁的概念所谓死锁,是指多个进程在运行过程中因争夺资源而照成的一种僵局。当进程处于这种僵持状态时,若无外力作用,它们都将无法再继续执行。产生死锁的原因竞争资源。当系统中供多个进程共享的资源如打印机、公用队列等,其数目不足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁。 进程间推进顺序非法。进程在运行过程中,请求和释放资源的顺序不当,也同样会产生进程死锁。class T...原创 2019-06-02 23:34:16 · 500 阅读 · 0 评论 -
Java多线程专题-synchronized的使用
为什么有线程安全问题?当多个线程同时共享同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。使用同步方式解决线程安全问:如何解决多线程之间线程安全问题?答:使用多线程之间同步synchronized或使用锁(lock)。问:为什么使用线程同步或使用锁能解决线程安全问题呢?答:将可能会发生数据冲突问题(线程不...原创 2019-06-02 23:24:55 · 667 阅读 · 0 评论 -
Java多线程专题-多线程join方法的作用
Join方法概述join作用是让其他线程变为等待。t1.join(); // 让其他线程变为等待,直到当前t1线程执行完毕,才释放。thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。class JoinThread implements Runn...原创 2019-06-02 23:13:04 · 320 阅读 · 0 评论 -
Java多线程专题-线程的运行状态
先观察下面这张图线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。新建状态当用new操作符创建一个线程时, 例如new Thread(r),线程还没有开始运行,此时线程处在新建状态。 当一个线程处于新生状态时,程序还没有开始运行线程中的代码就绪状态一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。...原创 2019-06-02 23:05:35 · 158 阅读 · 0 评论 -
Java多线程专题-守护线程
什么是守护线程Java中有两种线程,一种是用户线程,另一种是守护线程。 用户线程是指用户自定义创建的线程,主线程停止,用户线程不会停止 守护线程当进程不存在或主线程停止,守护线程也会被停止。 使用setDaemon(true)方法设置为守护线程守护线程案例** * * 什么是守护线程? 守护线程 进程线程(主线程挂了) 守护线程也会被自动销毁. * */public ...原创 2019-06-02 23:00:38 · 114 阅读 · 0 评论 -
Java多线程专题-Java多线程简介及创建方式
Java多线程简介线程是程序中一个单一的顺序控制流程。进程内有一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指令运行时的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。多线程指在程序内部同时执行多条任务线,各自同时进行处理不同的任务,从而最大限度利用计算机性能,提高程序效率。进程与线程比较每个正在系统上运行的程序都是一个进程。每个进程...原创 2019-06-02 22:38:19 · 129 阅读 · 0 评论 -
Java多线程专题-线程锁深度解析
我们在前面章节也提到过多线程的锁机制,但没有深入的去研究锁的种类以及其用法。在这里做一个深度说明。多线程锁是为了解决有可能产生得线程安全问题,从而保证多线程程序的健壮性和可靠性。本节我们将讨论Java多线程中的各种锁以及其用法。悲观锁和乐观锁悲观锁和乐观锁无具体实现,只是概念上的锁。下面会讲到这两种概念锁的具体实现细节何其应用场景。悲观锁(Pessimistic Lock)顾...原创 2019-06-05 21:37:19 · 320 阅读 · 0 评论 -
Java多线程专题(总结)-加锁对性能的影响、CAS如何保证线程安全
加锁通常会严重地影响性能。线程会因为竞争不到锁而被挂起,等锁被释放的时候,线程又会被恢复,这个过程中存在着很大的开销,并且通常会有较长时间的中断,因为当一个线程正在等待锁时,它不能做任何其他事情。如果一个线程在持有锁的情况下被延迟执行,例如发生了缺页错误、调度延迟或者其它类似情况,那么所有需要这个锁的线程都无法执行下去。这个测试程序调用了一个函数,该函数会对一个64位的计数器循环自增5亿次。机...原创 2019-06-11 21:37:07 · 5671 阅读 · 0 评论