![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 93
碰碰猪
华中科技大学自动化研究生
展开
-
Java并发容器之LinkedBlockingQueue
上一篇我们学习了ArrayBlockingQueue的实现原理,这一篇我们来学习与之对应的LinkedBlockingQueue。很明显,ArrayBlockingQueue内部是基于数组实现的,而LinkedBlockingQueue是基于链表。他们都实现了阻塞队列的take和put方法,下面我们会结合ArrayBlockingQueue作对比,来分析LinkedBlockingQueue的实现原创 2017-06-29 13:12:13 · 428 阅读 · 0 评论 -
Java并发之Semaphore
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。一、方法摘要Semaphore(int permits):构造方法,创建具有给定的许可数和非公平锁的Semaphore。Semaphore(int permits, Boolean fair):构造方法,创建具有给定许可数和给定公平设置的Semaphore。void acqu原创 2017-07-17 20:44:13 · 262 阅读 · 0 评论 -
Java并发容器之ArrayBlockingQueue
一、ArrayBlockingQueue简介 ArrayBlockingQueue是一个数组支持的有界阻塞队列。按照FIFO的原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列获取操作则是从队列头部开始获得元素。 这是一个典型的“有界缓存区”,固定大小的数组在其中保持生产者插入的元素和使用者提取的原创 2017-06-28 11:14:09 · 338 阅读 · 0 评论 -
Java并发容器之阻塞队列简介
阻塞队列(BlockingQueue)是支持两个附加操作的队列,这两个操作支持阻塞的插入和移除方法。 1)支持阻塞的插入方法,当队列满时,队列会阻塞插入元素的线程,直到队列不满。 2)支持阻塞的移除方式,当队列为空时,获取元素的线程会等待直到队列不为空。 几种插入、移除方法比较: 插入方法: 1)add(e):将指定的元素插入到此队列的尾部(如果立原创 2017-06-28 09:51:24 · 227 阅读 · 0 评论 -
Java并发容器之ConcurrentLinkedQueue
队列(Queue)是一种先进先出的数据结构,Java中实现了Queue接口的类都具有队列的功能。我们常用的LinkedList就实现了Queue接口,具有了offer()、poll()等操作。但是,LinkedList是线程不安全的,只使用于单线程操作。如果要实现一个线程安全的队列,一般有两种方式:一是使用阻塞算法,给读写操作加锁;二是使用非阻塞算法,通过循环CAS的方式来实现。本篇文章的Conc原创 2017-06-27 11:19:17 · 353 阅读 · 0 评论 -
Java并发容器ConcurrentHashMap原理及HashMap死循环原因的分析
HashMap是我们最常用的数据结构之一,它方便高效,但遗憾的是,HashMap是线程不安全的,在并发环境下,在HashMap的扩容过程中,可能造成散列表的循环锁死。而线程安全的HashTable使用了大量Synchronized锁,导致了效率非常低下。幸运的是,并发编程大师Doug Lea为我们提供了ConcurrentHashMap,它是线程安全版的HashMap。这篇文章将为大家简单分析一下原创 2017-06-26 10:56:44 · 4407 阅读 · 0 评论 -
Java多线程中Lock的实现
在Java 1.5之后,并发包中新增了Lock接口用来实现锁功能,它提供了Synchronized关键字类似的功能,只是在使用时需要显式地获取锁和释放锁。虽然它缺少了隐式获取锁释放锁的便捷性,但是却拥有了锁释放和获取的可操作性、可中断地获取锁以及超时获取锁等多种选择。1 Lock接口Lock接口的主要api如下:1)void lock():获取锁,调用该方法的当前线程或获取锁,并从该方原创 2017-06-25 16:08:15 · 367 阅读 · 0 评论 -
Java并发之ThreadLocal
在Java中,对象是线程共享的,当我们想让线程独自拥有专属于自己的变量时,可以使用ThreadLocal类。 ThreadLocal类提供了线程局部(Thread-Locak)变量。这些变量不同于他们的普通对应物,因为访问某个变量的每个线程都有自己的局部变量。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本。所以,每一个线程都可以独立原创 2017-07-13 14:46:26 · 449 阅读 · 0 评论 -
Java多线程中Synchronized和Lock的区别
之前已经介绍过了Synchronized锁的实现原理,简单概括就是在JVM层运用了object的monitor来实现同步。而Lock是Java大神 Doug Lea 开发的util.concurrent中的一个锁工具,它实现了Synchronized的所有功能。下面从使用、性能这两个部分来具体分析两者的不同。一.Synchronized和Lock的用法区别Synchronized:在需要同原创 2017-06-25 12:00:38 · 1055 阅读 · 0 评论 -
Java多线程中线程的几种状态
Java线程在运行的生命周期中可能处于6种状态,每个确定时刻,线程只可能处于一种状态,6种状态如下:1)NEW:初始状态,线程被构建,但是还没有执行start()方法。2)RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行中”。3)BLOCKED:阻塞状态,表示线程阻塞于锁。4)WAITING:等待状态,需要其他线程唤醒或者做出一些特性动作(通知或原创 2017-06-24 10:37:54 · 419 阅读 · 0 评论 -
Java并发之CyclicBarrier
上一篇我们介绍了CountDownLatch的使用方法和实现原理,CountDownLatch的计数器只能使用一次,用来使一组线程阻塞于另一组线程。本篇我将介绍Java另一款并发工具CyclicBarrier。一、同步屏障CyclicBarrier CyclicBarrier的字面意思是可循环使用的屏障。它的功能是,让一组线程到达一个屏障时被阻塞,知道最后一个线程到达屏障时,取消阻塞原创 2017-07-11 12:17:34 · 670 阅读 · 0 评论 -
Java中的volatile关键字
当变量声明为volatile后,这个变量仿佛就具有了同步的特性,那么,volatile和正真的同步有什么区别呢?什么情况下,使用volatile可以代替Synchronized呢?下面我将同大家一起学习volatile关键字。 一,volatile特性 对volatile变量的单个读/写,可以看成为使用同一个锁,对普通变量的单个读操作函数和写操作函数进行加锁(不能是I++这种操作原创 2017-06-23 20:43:53 · 236 阅读 · 0 评论 -
Java内存模型的几个关键词
Java内存屏障:为了保证内存的可见性,Java编译器在生成指令序列的适当位置会插入内存屏障指令来禁止特定类型的处理器重排序。Java内存模型把内存屏障指令分为四类如下: 1)LoadLoad Barriers :确保Load1数据的装载先于Load2及所有后续转载指令的装载。 2)StoreStore Barriers:确保Store1数据对其他处理器可见先于Store2及所原创 2017-06-23 19:37:58 · 243 阅读 · 0 评论 -
Java多线程中实现原子操作的方法
在Java中可以通过锁和循环CAS操作的方式来实现原子操作。一,使用循环CAS实现原子操作 JVM中的CAS操作是利用了处理器提供的 CMPXCHG 指令实现的。自旋CAS实现的基本思路就是循环进行CAS操作,直到成功为止。CAS是Compare And Swap的缩写,其操作需要输入两个值,一个旧值,一个新值,在操作期间比较旧值有没有发生改变,如果没发生,才交换成新值,发生了变化则原创 2017-06-23 10:59:04 · 876 阅读 · 0 评论 -
Java多线程中join方法的实现
方法join的作用是使所属的线程对象t正常执行run()方法中的任务,而使当前线程z进行阻塞,等待t销毁后再继续执行z后面的代码。下面贴出join方法的源码: public final synchronized void join(long millis) throws InterruptedException { long base = System.cur原创 2017-06-20 15:31:57 · 344 阅读 · 0 评论 -
Java多线程中Synchronized的实现原理与优化
一.Synchronized的实现原理 在Java中,每个对象有一个监视器monitor,当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时会尝试获取monitor的所有权,过程如下: 1.如果monitor的进入数 entry count为0,则该线程成功进入monitor,然后将 entry count 设为1,该线程即为monitor的拥有者原创 2017-06-22 10:49:41 · 320 阅读 · 0 评论 -
Java并发之线程池简介
一、线程池简介 在Java中,使用线程来异步执行任务。Java线程的创建与销毁需要一定的开销,如果我们为每个任务创建一个新的线程来执行,这些线程的创建与销毁将消耗大量的计算资源。Java的线程在此情况下,既是工作单元,也是执行机制。为了减少创建线程的额外开支,将工作单元与执行机制分离不失为一个好办法。由此,Java线程池自然的被设计出了。 合理地使用线程池带来极大的好处原创 2017-06-30 16:22:38 · 218 阅读 · 0 评论 -
Java并发之CountDownLatch
在并发操作中,当需要当前线程c等待另一线程a结束后在运行的话,我们首先想到的是join方法,在c线程运行中调用a.join(),该方法会使当前线程阻塞于a,直到线程a运行结束,JVM调用a.notifyAll()方法唤醒z。 在Java1.5之后,并发包提供的CountDownLatch也可以实现join功能,并且更为强大。一、使用方法 下面放出一个简单的Demo:pu原创 2017-07-10 10:47:49 · 194 阅读 · 0 评论