为什么要有JDK并发包呢?因为为了多线程安全。。。。
文章目录
- 一、同步控制:synchronized,ReentrantLock,Semaphore,ReadWriteLock,ThreadLocal
- 1、sychronized :[参考文章](https://blog.csdn.net/tangyuan_sibal/article/details/88693992)
- 2、ReentrantLock : [参考文章](https://blog.csdn.net/tangyuan_sibal/article/details/88743108)
- 3、Semaphore:[参考文章](https://www.cnblogs.com/liuyun1995/p/8474026.html)
- 4、ReadWriteLock:[参考文章](https://www.cnblogs.com/zaizhoumo/p/7782941.html)
- 5、ThreadLocal:[参考文章](https://www.jianshu.com/p/56f64e3c1b6c) [参看文章](https://www.cnblogs.com/micrari/p/6790229.html)
- 6、CountDownLatch:[参考文章](https://www.cnblogs.com/liuyun1995/p/8528988.html)
- 7、CyclicBarrier:[参考文章](https://www.cnblogs.com/liuyun1995/p/8529360.html)
- 二、线程池:
- 三、JDK并发容器
下面主要从三个部分来了解JDK并发包(java.util.concurrent):多线程的团队协作(同步控制)、线程复用(线程池)、不要重复发明轮子(JDK的并发容器)
一、同步控制:synchronized,ReentrantLock,Semaphore,ReadWriteLock,ThreadLocal
1、sychronized :参考文章
2、ReentrantLock : 参考文章
3、Semaphore:参考文章
4、ReadWriteLock:参考文章
5、ThreadLocal:参考文章 参看文章
ThreadLocal解决spring单例模式(scope=singleton)下的线程安全问题
spring在加载bean的时候有四种配置:singleton,prototype,request,session,
而默认情况下是采用singleton,那么在多线程下,如何保证线程安全呢。就可以用ThreadLocal来解决。
6、CountDownLatch:参考文章
7、CyclicBarrier:参考文章
二、线程池:
1、线程池的种类:
public static ExecutorService newFixedThreadPool(int nThreads)//创建一个固定大小的线程池
public static ExecutorService newSingleThreadExecutor()//创建只有一个线程的线程池
public static ExecutorService newCachedThreadPool()//创建具有无限的线程池
public static ScheduledExecutorService newScheduledThreadPool()
public static ExecutorService newFixedThreadPool(int corePoolSize)
2、前面三个线程池的核心实现(ThreadPoolExecutor)
ThreadPoolExecutor的参数:
1、corePoolSize:
2、maximumPoolSize:
3、keepAliveTime:(非核心线程的存活时间)
4、unit:
5、workQueue:(这四个都是基于实现BlockingQueue接口来实现的)
①SynchronousQueue
常用于newCachedThreadPool(因为这是一个无限容量的线程池,core为0,max为无穷大)
②ArrayBlockingQueue
③LinkedBlockQueue
常用在newFixedThreadPool(因为这个是一个固定大小的线程池,所以当很多线程产生时会有很多线程产生阻塞)
④PriorityBlockingQueue
6、threadFactory:
7、handle:
默认的拒绝策略有四种:
AbortPolicy:该策略会直接抛出异常,阻止系统正常工作
CallerRunsPolicy:只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的任务。
DiscardOldestPolicy:该策略将丢弃最老的一个请求
DiscardPolicy:默默丢弃无法处理的任务,不予任何处理。如果允许任务丢失,这是最好的方式。
通过上面的代码我们可以发现这四种策略都是基于实现RejectedExecutionHandler
的。这样我们也可以自己实现这个借口来创建拒绝策略
三、JDK并发容器
为了解决java集合类Collection的不安全而存在
1、concurrentHashMap,比较深入的解析---->HashMap
2、CopyOnWriteArrayList—>ArrayList
3、ConcurrentLinkedQueue—>LinkedList(高效的并发队列)
相比较于BlockingQueue(ArrayBlockingQueue(读写锁不分离),LinkedBlockingQueue)(读写锁分离),ConcurrentLinkedQueue是采用CAS模式进行的,不加锁。
4、BlockingQueue(这是一个接口,主要的实现方式有ArrayBlockingQueue和LinkedBlockingQueue。功能用途超级多的一个阻塞队列),经常用于生产者和消费者模式
5、ConcurrentSkipListMap(用来进行快速查找)