一.Java阻塞队列
1.Java阻塞队列的原理:分为两种
(1)当队列为空的时候,消费者端会被阻塞
(2)当队列满了的时候,生产者端的队列会被阻塞。
2.介绍一个常遇到的Java的阻塞队列
1.ArrayBlockingQueue:数组阻塞队列,他的数据结构数组的有界的阻塞队列,遵循FIFO先进先出的原则,但是他是非公平的,无论是在生产者端,还是消费者端,他都是最先挂起的,最先去获取数据。
2.LinkBlockingQueue:列表阻塞队列,他的数据结构为链表的有界的阻塞队列,遵循FIFO的原则,与ArrayBlockingQueue有点类似,但是他在生产者端,和消费者端分别有锁,就是说生产者端和消费者端可以同时的去操作队列里面的元素。
3.PriorityBlockingQueue:具有优先级的无界阻塞队列,他的默认顺序为升序
4.DelayQueue:用于缓存和延迟的阻塞队列。
5.SynchronousQueue:里面不错存放任何一个元素的阻塞队列,他在进行PUT的时候,必须需要等待一个TAKE,他就类似于一个传递者而已,但是他的吞吐量比ArrayBlockingQueue,LinkBlockingQueue都大。
6.LinkedTransferQueue:他比一般的队列对了tryTransfer和Transfer方法,这两个方法都是会尝试,或者直接将生产者的元素直接的传递个消费者,或者到tail节点。
二.CountDownLatch(线程计数器),CyclicBarrier(会换-栅栏),Semaphore(信号量)
1.CountDownLatch:线程计数器,当一个任务需要等待其他的任务完成之后才可以继续执行下去,可以用到CountDoenLatch或者Join()方法
2.CyclicBarrier:一组线程需要统一到一个状态才可全部一起继续执行,可以用到CyclicBarrier。
3.Semaphore:信号量,控制可以同时访问的线程的数量,当数量为一的时候,可以做互斥锁。acquire(),tryAcquire():获取资源,release():释放资源。
三.volatile关键字
1.确保变量在各个线程之间的可见性。
2.禁止了指令重排序
3.但是他不确保原子性,所以i++还是需要注意
4.JMM-Java内存模型:
有一个主存和每条线程都有一个工作的额内存。