![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JUC
一朝红日出
这个作者很懒,什么都没留下…
展开
-
死锁编码及定位分析
1. 死锁是什么?2. 代码class HoldThread implements Runnable { private String lockA; private String lockB; public HoldThread(String lockA, String lockB) { this.lockA = lockA; this.lockB = lockB; } @Override public void原创 2021-05-11 16:42:50 · 39 阅读 · 0 评论 -
生产者消费者模型之阻塞队列版
import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;class MyResource{ private volatile boolean FLAG = true; //默认开启,进行生产+消费原创 2021-05-11 16:24:44 · 69 阅读 · 0 评论 -
Synchronized和Lock的区别
1. 原始构成方面synchronized是JVM层面,它是JAVA的关键字,底层是通过monitor对象来完成的。Lock是API层面的具体类,它是java5以后新出的一个类。2. 使用方法synchronized 是不需要手动释放锁,当synchronized代码执行完以后,系统会自动让线程释放对锁的占用。lock就需要手动去释放锁,若没有主动的去释放锁,就可能导致死锁的现象。3. 等待是否可中断synchronized不能中断,除非是抛出了异常或者是正常执行完成。lock是可原创 2021-05-11 15:23:16 · 76 阅读 · 0 评论 -
公平锁/非公平锁/可重入锁/递归锁/自旋锁/独占锁/共享锁/互斥锁
1. 公平锁和非公平锁公平锁:是指多个线程按照申请锁的顺序来获取锁,类似排队打饭 ,先来后到。非公平锁:是指在多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情况下,有可能造成优先级反转或者饥饿现象。对于synchronized而言 也是一种非公平锁。并发包ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或者非公平锁 默认是非公平锁。空参构造器:非公平锁带参构造器:公平锁2. 可重入锁(又名递归锁原创 2021-05-11 14:53:48 · 473 阅读 · 0 评论 -
CAS引发ABA问题
1. ABA问题2. 原子引用AtomicReferenceimport lombok.AllArgsConstructor;import lombok.Getter;import lombok.Setter;import lombok.ToString;import java.util.concurrent.atomic.AtomicReference;@Getter@Setter@AllArgsConstructor@ToStringclass User1{ priv原创 2021-05-10 16:08:43 · 59 阅读 · 0 评论 -
CAS
1. CAS是什么?CAS的两句话概括:1.如果线程的期望值跟物理内存的真实值一样,就更新值到物理内存当中,并返回true。2.如果线程的期望值跟物理内存的真实值不一样,返回是false,那么本次修改失败,那么此时需要重新获得主物理内存的新值。public class CASDemo { public static void main(String[] args) { AtomicInteger atomicInteger = new AtomicInteger(5);原创 2021-05-10 15:00:12 · 138 阅读 · 0 评论 -
volatile是什么?
1.volatile是Java虚拟机提供的轻量级的同步机制保证可见性不能保证原子性禁止指令重排面试题:volatile是Java虚拟机提供的轻量级的同步机制,是基本上遵守了JMM的规范,主要是保证可见性和禁止指令重排,但是它并不保证原子性。2. JMMJMM(Java内存模型Java Memory Model,简称JMM)本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过规范定制了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。JMM关于同步规定原创 2021-05-10 10:21:12 · 698 阅读 · 2 评论 -
十五. 线程池
线程池的优势:线程池做的工作只要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。它的主要特点为:线程复用;控制最大并发数;管理线程。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的销耗。第二:提高响应速度。当任务到达时,任务可以不需要等待线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会销耗系统资源,还会降低原创 2021-04-30 12:18:55 · 61 阅读 · 0 评论 -
十四. BlockingQueue阻塞队列
阻塞队列阻塞:必须要阻塞/不得不阻塞阻塞队列是一个队列,在数据结构中起的作用如下图:线程1往阻塞队列里添加元素,线程2从阻塞队列里移除元素当队列是空的,从队列中获取元素的操作将会被阻塞; 当队列是满的,从队列中添加元素的操作将会被阻塞 。试图从空的队列中获取元素的线程将会被阻塞,直到其他线程往空的队列插入新的元素 。试图向已满的队列中添加新元素的线程将会被阻塞,直到其他线程从队列中移除一个或多个元素或者完全清空,使队列变得空闲起来并后续新增。在多线程领域:所谓阻塞,在某些情况下原创 2021-04-29 23:33:49 · 65 阅读 · 0 评论 -
十三. ReadWriteLock读写锁
ReadWriteLock读写锁多个线程同时读一个资源类没有任何问题,所以为了满足并发量,读取共享资源应该可以同时进行。但是有一个线程想去写共享资源,就不应该再有其他线程可以对该资源进行读或写总结: 读读----能共存 读写----不能共存 写写----不能共存//问题代码class MyCache{ private volatile Map<String,Object> map = new HashMap<>(); public vo原创 2021-04-29 22:53:27 · 92 阅读 · 0 评论 -
十二.semaphore(信号量)
semaphore信号量主要用于两个目的:一个是用于多个共享资源的互斥使用另一个用于并发线程数的控制。public static void main(String[] args) { Semaphore semaphore = new Semaphore(3); //模拟资源类,抢占座位 for (int i = 0; i < 6; i++) { new Thread(()->{ try原创 2021-04-29 15:38:10 · 109 阅读 · 0 评论 -
十一. CyclicBarrier调整线程执行顺序
CyclicBarrier调整线程执行顺序CyclicBarrier 的字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是, 让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。线程进入屏障通过CyclicBarrier的await()方法。public class CyclicBarrierDemo{ private static final int NUMBER = 7; publ原创 2021-04-29 15:20:30 · 342 阅读 · 1 评论 -
十. CountDownLatch调整线程顺序
CountDownLatch可以调整线程执行顺序CountDownLatch主要有两个方法: await()和countDown()当一个或多个线程调用await方法时,这些线程会阻塞。其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞), 当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。public class Demo { public static void main(String[] args) throws In原创 2021-04-29 14:59:48 · 321 阅读 · 0 评论 -
九.获得多线程的四种方法
1. 继承Thread类class MyPrint extends Thread{ @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+"*"); } }}2. 实现Runnable接口new Thread(new Runnable() {原创 2021-04-29 14:34:41 · 133 阅读 · 0 评论 -
八. HashMap线程不安全
1. 举例说明HashMap线程不安全public class NotSafeDemo { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); for (int i = 1; i <= 30 ; i++) { new Thread(()->{ map.put(原创 2021-04-29 13:43:03 · 94 阅读 · 0 评论 -
七. HashSet线程不安全
1. 举例说明HashSet线程不安全public class NotSafeDemo { public static void main(String[] args) { Set<String> set = new HashSet<>(); for (int i = 1; i <= 30 ; i++) { new Thread(()->{ set.add(UUID.ran原创 2021-04-29 13:24:28 · 1183 阅读 · 2 评论 -
六. ArrayList线程不安全
1. 举例说明集合类是不安全的//一个线程的时候无论如何也不会出错public class NotSafeDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); for (String e原创 2021-04-29 12:44:56 · 51 阅读 · 0 评论 -
五.锁的8种情况
多线程8锁标准访问,先打印短信还是邮件停4秒在短信方法内,先打印短信还是邮件普通的hello方法,是先打短信还是hello现在有两部手机,先打印短信还是邮件两个静态同步方法,1部手机,先打印短信还是邮件两个静态同步方法,2部手机,先打印短信还是邮件1个静态同步方法,1个普通同步方法,1部手机,先打印短信还是邮件1个静态同步方法,1个普通同步方法,2部手机,先打印短信还是邮件1.标准访问,先打印短信还是邮件class Phone{ public synchronized v.原创 2021-04-28 16:30:44 · 191 阅读 · 0 评论 -
四. 精确通知顺序访问
多线程之间按顺序调用,实现A->B->C三个线程启动,要求如下: AA打印5次,BB打印10次,CC打印15次 接着AA打印5次,BB打印10次,CC打印15次高聚低合前提下,线程操作资源类判断/干活/通知多线程交互中,必须防止多线程的虚假唤醒,也即(判断只能用while,不能用if)标志位//三个操作方法的版本import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lo.原创 2021-04-28 15:47:07 · 55 阅读 · 0 评论 -
三. 生产者消费者模型
1. synchronized实现//题目:现在两个线程,可以操作初始值为0的一个变量,实现两个线程对该变量加1, 两个线程对该变量减1,实现交替,来十轮,变量初始值仍为0;//步骤: 1. 线程 操作 资源类 // 2.判断 干活 通知 // 3.多线程交互中,必须防止多线程的虚假唤醒,也即(判断只用while,不能用if)class Air{ // 资源类 private int number = 0; public synchronized void i原创 2021-04-28 11:03:06 · 76 阅读 · 0 评论 -
二. lambda表达式
@FunctionalInterface//函数式接口可以有多个default方法,多个静态方法,只能有一个普通方法。interface Foo{ public int add(int x,int y); default int div(int x,int y) { return x/y; } public static int sub(int x,int y) { return x-y; }}/** * * @De原创 2021-04-28 09:34:26 · 63 阅读 · 0 评论 -
一. JUC
JUC1. 什么是JUC?2. 什么是进程/线程?进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。线程:通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出原创 2021-04-28 09:14:00 · 71 阅读 · 0 评论 -
LockSupport
LockSupportLockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport中的park()和unpark()的作用分别是阻塞线程和解除阻塞线程。3种让线程等待和唤醒的方法使用Object中的wait()方法让线程等待,使用Object中的notify()方法唤醒线程使用JUC包中Condition的await()方法让线程等待,使用signal()方法唤醒线程LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程1. 使用Object中的w原创 2021-04-27 15:26:59 · 5441 阅读 · 2 评论 -
可重入锁
可重入锁可重入锁,又名递归锁,是指同一个线程在外层方法获取锁的时候,再进入该线程内层方法会自动获取锁(前提,锁对象是同一个对象),不会因为之前已经获取过还没释放而阻塞。Java中的ReentrantLock和synchronized都是可重入锁,可重入锁的一个优点就是可一定程度避免死锁。一个线程中的多个流程可以获取同一把锁,持有这把同步锁可以再次进入。自己可以获取自己的内部锁。(否则自己又要等着自己释放锁再获取锁)可重入锁的种类隐式锁(即synchronized关键字使用的锁)默认是可原创 2021-04-15 23:28:43 · 231 阅读 · 0 评论