![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JUC
文章平均质量分 76
JUC并发编程
哦嗨哟思密达
欲戴皇冠,必承其重!
展开
-
彻底搞懂同步,异步,阻塞,非阻塞
标题下面是我从几篇好评的文章中截取出来一些容易理解的部分 1、同步:是应用程序要直接参与 IO 读写的操作 对于一个socket上的输入操作,第一步就是通常涉及等待数据从网络中到达,当所等待的分组到达的时候,它就被复制到内核中的某个缓冲区中,这个时候便是我们常说的数据已经准备好了。第二步就是把数据从内核的缓冲区拷贝到应用进程的缓冲区中。这一步往往是我们进程阻塞的原因,因为用户进行需要等待去获取内核中的数据。所以socket的一次输入操作就涉及到两次的IO操作:操作系统IO和应用程序IO。 所谓的同步在这里原创 2022-03-18 11:56:56 · 1304 阅读 · 0 评论 -
JUC面试
1. 什么是线程安全 当多个线程访问某个实例对象的方法时,不管你通过怎样的调用方式或者说这些线程如何交替的执行,得到的结果始终和单线程下所获得的结果是一样的,那么我们就可以说这个对象是线程安全的。 2. 多线程的核心概念 原子性:一些业务操作要么同时执行成功要么同时失败 可见性:当某个线程修改某个共享资源时,其他线程能够立刻看到 有序性:程序执行的顺序按照代码的先后顺序执行。 3. 如何实现线程安全 1、第一种 : 互斥同步(synchronized和lock锁) JUC学习笔记-01-Synchron原创 2021-09-28 00:40:15 · 137 阅读 · 0 评论 -
JUC学习笔记-16-各种锁的理解
公平锁,非公平锁 公平锁:非常公平,不能插队,必须先来后到 /** * Creates an instance of {@code ReentrantLock}. * This is equivalent to using {@code ReentrantLock(false)}. */ public ReentrantLock() { sync = new NonfairSync(); } 非公平锁:非常不公平,允许插队,可以改变顺序。 因为有时候,一些线程的执行时间很长,如果其他线程需原创 2021-08-21 13:31:08 · 117 阅读 · 0 评论 -
JUC学习笔记15-彻底搞懂CAS&原子引用
CAS CAS的介绍 CAS( CompareAndSwarp ,比较并交换)是一个CPU的并发原语,原语是属于操作系统用于范畴,是由若干条指令组成的,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条原子指令,是个原子性操作,它的功能就是判断内存中的某个位置的值是否是预期值,如果是则更新为自己执行的新值。这个操作是原子性的,也就是说并发的时候不会出现指令重排导致数据不一致问题的现象;这个操作是基于内存级别操作的,通过unsafe类之间操作内存中的值。 p原创 2021-08-21 11:46:25 · 240 阅读 · 1 评论 -
JUC学习笔记-14-彻底玩翻单例模式
单例模式的创建 1 饿汉式单例 //饿汉式单列 public class HungryDemo1 { private HungryDemo1() { } private final static HungryDemo1 HungryDemo1 = new HungryDemo1(); public static HungryDemo1 getInstance(){ return HungryDemo1; } } 2 懒汉式单例 //懒汉式单例转载 2021-08-20 23:04:42 · 135 阅读 · 0 评论 -
JUC学习笔记-13-深入剖析JMM&volatile
JMM 1 什么是JMM JMM:Java内存模型,不存在的东西,是一个概念,也是一个约定,该模型约定了每一个线程的工作内存应如何与主内存打交道。 Java内存模型(Java Memory Model,JMM)JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工原创 2021-08-20 18:56:04 · 106 阅读 · 0 评论 -
JUC学习笔记-12-Future&CompletableFuture学习
Future 1 Future的认识 Future表示一个可能还没有完成的异步任务的结果。 线程是属于异步计算模型,所以你不可能直接从别的线程中得到函数返回值。 这时候,Future就出场了。Futrue可以监视目标线程调用call的情况,当你调用Future的get()方法以获得结果时,当前线程就开始阻塞,直接call方法结束返回结果。 2 Future的体系结构图 Future接口定义了主要的5个接口方法,有RunnableFuture和SchedualFuture继承这个接口,以及CompleteFu原创 2021-08-19 22:52:05 · 234 阅读 · 0 评论 -
JUC学习笔记-11-ForkJoin分支合并
11 分之合并 11.1 什么是ForkJoin ForkJoin是一个并发执行任务的框架,其核心思想就是任务切分,结果合并。 当任务足够小的时候可以直接解决它,否则将任务切分成可以独立解决的部分,小的任务解决之后再将它们合并。 ForkJoin框架得到组成 ForkJoinTask ForkJoinWorkerThread ForkJoinPool ForkJoin框架的特点 工作窃取 一些线程共同执行某个大任务的时候,已完成本线程工作的线程可以窃取其他线程未完成的任务,提高执行效率 11.原创 2021-08-19 21:52:14 · 112 阅读 · 0 评论 -
JUC学习笔记-10-四大函数式接口和Stream流式计算
新时代的程序员:lambda表达式、链式编程、函数式接口、Stream流式计算 函数式接口:只有一个方法的接口 10.1 四大函数式接口 10.1.1 Function函数型接口 需传入的泛型类型 第一个泛型是输入值的类型 第二个泛型是返回值的类型 import java.util.function.Function; //四大函数式接口之函数型接口 public class FunctionDemo { public static void main(String[] args) {原创 2021-08-19 18:18:50 · 111 阅读 · 0 评论 -
JUC学习笔记-09-线程池ThreadPoolExecutor
9 线程池 线程池重点内容:三大方法、7大参数、拒绝策略、优化配置 9.1 为什么需要线程池 多线程的情况下确实可以最大限度发回去多核CPU处理器的计算能力,提高系统的吞吐量。但是如果过随意使用线程,对系统的性能反而有着不利的影响。 线程需要占据CPU的计算能力以及系统的内存资源,而且线程的创建和销毁也是需要时间的,如果创建和销毁的时间远大于线程执行的时间,那么想要提高系统的性能将会得不偿失。大量的线程需要占用内存空间,可能会导致out of memory异常,而且大量的线程回收也会给GC带来很大的压力,而原创 2021-08-19 17:14:03 · 111 阅读 · 0 评论 -
JUC学习笔记-08-阻塞队列BlockingQueue
阻塞队列BlockingQueue的概念 队列:排队 特性:先进先出 FIFO 阻塞:必须要阻塞、不得不阻塞 阻塞队列的应用场景:多线程并发处理,线程池 BlockingQueue与List的千丝万缕 List的实现类和BlockingQueue的实现类 List的实现类 ArrayList LinkedList BlockingQueue的实现类 ArrayBlockingQueue LinkedBlockingQueue ArrayBlockingQueue的四组API 1原创 2021-08-19 11:55:17 · 126 阅读 · 0 评论 -
JUC学习笔记-07-读写锁的使用
读写锁ReadWriteLock的特性: 读写锁的使用场合是:读取数据的频率远大于修改共享数据的频率。可以提高并发性能。 读锁允许多个reader线程同时持有,而写锁最多只能有一个线程持有。 如果一个线程已经持有了写锁,则可以再持有读或者写锁即可重入。 如果一个线程已经持有了读锁,则在释放该读锁之前,不能再持有写锁。 如果当前线程是读状态,那么其他线程也同时马上可以获取读锁,但若想获取写锁,就会禁止进入转而进入等待队列,后面想要获取读锁或者写锁的线程也必须进入等待队列。等正在工作的线程释放锁才能获取到。原创 2021-08-19 10:33:18 · 155 阅读 · 0 评论 -
JUC学习笔记-06-JUC三大常用辅助类
CountDownLatch 适用场景: 一个线程需要等待其他多个线程执行完以后才执行 下面的案例是:创建一个减计数器,其中包含14个线程任务,任务就是只有等14人完全进入飞机才起飞,每完成一个任务,计数器就减一,等到计数器归零的时候(countDownLatch.await();)才会执行下面的代码,由于是在这个对象是在主线程里面创建得到,也就是执行主线程下面的代码 简单来说就是:只有等计数器归零才能执行countDownLatch.await();下面代码 CountDownLatch的主要方法 n原创 2021-08-18 23:03:55 · 90 阅读 · 0 评论 -
JUC学习笔记-05-走进Callable
Runnable与Callable的区别 我们知道,创建线程的方式可以通过Thread类,Runnable接口,和Callable接口三种方式。其中Runnable和Callable是作为任务存在的。它们区别如下: 1、是否有返回值 Runnable 没有返回值,Callable有返回值 2、是否跑出异常 Runnable 没有异常,Callable有异常 3、方法不同, run(),call() Runnable 运行的方法是run,Callable运行的方法是call Runnable的使用方式 p原创 2021-08-18 21:43:16 · 80 阅读 · 0 评论 -
JUC学习笔记-04-集合不安全解决方案
1 List类 List类不安全 1.1 单线程:安全 //单线程:安全 public class ListOneThread { public static void main(String[] args) { List<String> list = Arrays.asList("a", "b", "c"); list.forEach(System.out::println); } } 1.2 多线程:不安全 抛出异常:java.util原创 2021-08-18 21:08:18 · 74 阅读 · 0 评论 -
JUC学习笔记-03-8/6锁现象实战
类锁是对静态方法使用synchronized关键字后,无论是多线程访问单个对象还是多个对象的sychronized块,都是同步的,但是目前已经不支持通过实例对象调用静态方法了。 对象锁是实例方法使用synchronized关键字后,如果是多个线程访问同个对象的sychronized块,才是同步的,但是访问不同对象的话就是不同步的。 类锁和对象锁是两种不同的锁,可以同时使用,但是注意类锁不要嵌套使用,这样子容易发生死锁。 类锁 代码块锁 public void add(int m){ //锁的对象.原创 2021-08-18 18:14:19 · 68 阅读 · 0 评论 -
JUC学习笔记-01-Synchronized 与Lock 的区别
synchronized与lock锁的区别 来源: lock是一个接口,而synchronized是java的一个关键字,synchronized是内置的语言实现; 异常是否释放锁 synchronized在发生异常时候会自动释放占有的锁,因此不会出现死锁;而lock发生异常时候,不会主动释放占有的锁,必须手动unlock来释放锁,可能引起死锁的发生。(所以最好将同步代码块用try catch包起来,finally中写入unlock,避免死锁的发生。) 是否中断等待 lock等待锁过程中可以用interr原创 2021-08-18 16:05:43 · 126 阅读 · 0 评论 -
JUC学习笔记-02-lock锁Condition的使用
Condition的认识 Condition中的await()方法相当于Object的wait()方法 Condition中的signal()方法相当于Object的notify()方法 Condition中的signalAll()相当于Object的notifyAll()方法。 Condition能够更加精细的控制多线程的休眠与唤醒。对于同一个锁,我们可以创建多个Condition,在不同的情况下使用不同的Condition,唤醒不同的线程,从而实现业务之间的通信。 ReentrantLock锁的使用原创 2021-08-18 16:45:52 · 233 阅读 · 0 评论