摘要:
###1.LockSupport是什么? LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。 LockSupport中的park()和unPark()的作用分别是阻塞线程和解除阻塞线程 ###2.线程等待唤醒机制(wait/notify) 1.三种让线程等待和唤醒的方法 方式1:使用 阅读全文
摘要:
###1.死锁是什么? 死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉那它们都将无法推进下去,如果系统资源充足,线程的资源请求都能得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。 ###2.产生死锁的主要原因 1.系统资源不足 2. 阅读全文
摘要:
###1.为什么用线程池,线程池的优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕,再从队列中取出任务来执行。 他的主要特点为:线程复用,控制最大并发数,线程管理。 第一:降低 阅读全文
摘要:
###1.Callable构建线程的使用 示例代码: class MyThread implements Callable<Integer> { @Override public Integer call() throws Exception { int sum = 0; for (int i = 阅读全文
摘要:
###1.wait和notify传统版本 示例代码: class MyData { private int number = 0; public synchronized void add() throws InterruptedException { while (number != 0) { t 阅读全文
摘要:
###1.原始构成 synchronized是关键字属于JVM层面, monitorentry(底层是通过monitor对象来完成,其wait/notify等方法也是依赖于monitor对象只有在同步块或方法中才能调用wait/notify等方法) monitorexit Lock是具体类(java 阅读全文
摘要:
阻塞队列,顾名思义,首先它是一个队列,而一个阻塞队列在数据结构中所起的作用大致如下 当阻塞队列是空的时候,从队列中获取元素的操作将会被阻塞。 当阻塞队列是满的时候,往队列里添加元素的操作将会被阻塞。 试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。 试图往已满的阻 阅读全文
摘要:
###1.CountDownLatch 让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒。 CountDownLatch主要有两个方法,当一个或多个线程调用await()方法时,调用线程会被阻塞。其它线程调用countDown()方法会将计数器减1(调用countDown方法的线程不会阻塞),当 阅读全文
摘要:
###1.公平锁和非公平锁 公平锁:是指多个线程按照申请锁的顺序来获取锁,类似排队打饭,先来后到。 非公平锁:是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁,在高并发的情况下,有可能会造成优先级反转或者饥饿现象。 并发包中ReentrantLock的创建可 阅读全文
摘要:
###1.ArrayList并发更新导致的异常 单线程情况下示例代码: public class ListDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); for (int i 阅读全文