![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
juc
文章平均质量分 92
沉泽·
心中有阳,眼里有光。
展开
-
线程之间的通信方式
前言我只是个搬运工,尊重原作者的劳动成果,本文来源下列文章链接:https://zhuanlan.zhihu.com/p/129374075https://blog.csdn.net/jisuanji12306/article/details/86363390线程之间为什么要通信?通信的目的是为了更好的协作,线程无论是交替式执行,还是接力式执行,都需要进行通信告知。首先,要短信线程间通信的模型有两种:共享内存和消息传递,以下方式都是基本这两种模型来实现的。我们来基本一道面试常见的题目来分析:题目转载 2021-08-02 17:07:01 · 6487 阅读 · 0 评论 -
多线程创建方式及区别
1.线程是什么?线程被称为轻量级进程,是程序执行的最小单位,它是指在程序执行过程中,能够执行代码的一个执行单位。每个程序程序都至少有一个线程,也即是程序本身。2.线程状态Java语言定义了5种线程状态,在任意一个时间点,一个线程只能有且只有其中一个状态。,这5种状态如下:(1)新建(New):创建后尚未启动的线程处于这种状态(2)运行(Runable):Runable包括了操作系统线程状态的Running和Ready,也就是处于此状态的线程有可能正在执行,也有可能正在等待着CPU为它分配执行时间。转载 2021-07-30 16:20:12 · 540 阅读 · 0 评论 -
线程的volatile关键字详解
系列文章目录文章目录系列文章目录简述解决死循环示例分析不能保证原子性简述关键字 volatile 的主要作用是使变量在多个线程间可见解决死循环示例class ThreadTest7 implements Runnable{ private boolean isRunnning = true; @Override public void run() { System.out.println("Thread begin: "+Thread.curr原创 2021-04-19 16:33:02 · 461 阅读 · 0 评论 -
java线程池的使用
本文转载于以下文章,原文链接如下:https://www.cnblogs.com/ljp-sun/p/6580147.htmlhttps://blog.csdn.net/yinni11/article/details/79917640前言为什么需要线程池?多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。如果:T1 + T3转载 2021-07-30 10:32:38 · 1237 阅读 · 0 评论 -
JUC-AQS详解(十八)
一、AQS 前置知识公平锁和非公平锁可重入锁LockSupport自旋锁数据结构之链表设计模式之模板设计模式二、AQS 是什么?1、字面意思AQS(AbstractQueuedSynchronizer):抽象的队列同步器一般我们说的 AQS 指的是 java.util.concurrent.locks 包下的 AbstractQueuedSynchronizer,但其实还有另外三种抽象队列同步器:AbstractOwnableSynchronizer、AbstractQueued转载 2022-03-15 16:58:44 · 396 阅读 · 0 评论 -
JUC-线程锁之ReentrantLock详解(三)
一、ReentrantLock简介jdk中独占锁的实现除了使用关键字synchronized外,还可以使用ReentrantLock。虽然在性能上ReentrantLock和synchronized没有什么区别,但ReentrantLock相比synchronized而言功能更加丰富,它更灵活、更强大,增加了轮询、超时、中断等高级功能,更适合复杂的并发场景。二、 ReentrantLock是独占锁且可重入的例子:public class ReentrantLockTest { public转载 2022-03-15 00:19:52 · 591 阅读 · 3 评论 -
JUC-LockSupport(十七)
一、LockSupport 是什么?LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport中的park()和unpark()的作用分别是阻塞线程和解除阻塞线程,可以将其看作是线程等待唤醒机制(wait/notify)的加强版二、传统两种线程等待唤醒的方法方式1: 使用Object中的wait()方法让线程等待, 使用Object中的notify()方法唤醒线程,与synchronized配合使用。方式2: 使用JUC包中Condition的await()方法让线转载 2022-03-14 16:04:31 · 154 阅读 · 0 评论 -
JUC-各种锁的理解(十六)
一、公平锁、非公平锁公平锁:获取不到锁的时候,会自动加入队列,等待线程释放后,队列的第一个线程获取锁非公平锁:获取不到锁的时候,会自动加入队列,等待线程释放锁后所有等待的线程同时去竞争Synchronized和ReentrantLock(默认构造)都是非公平的可重入锁:Synchronized常用的重量级锁Synchronized,它就是一个非公平的锁,因为在多线程的环境中,抢夺cpu的资源的过程中假如有7个线程,第一次抢到的可能是3号线程抢到,3号线程释放锁之后,第二次这7个线程继续抢,有可能转载 2022-02-19 23:12:31 · 616 阅读 · 0 评论 -
JUC-CAS介绍和原子引用(十五)
一、什么是CASCAS 是 Compare And Swap的简称,从字面上理解就是比较并更新,简单来说:从某一内存上取值V,和预期值A进行比较,如果内存值V和预期值A的结果相等,那么我们就把新值B更新到内存,如果不相等,那么就重复上述操作直到成功为止。在 Java的原子类中,有对cas的封装进行应用:此处用 AtomicInteger 举例public class CAS_Demo { public static void main(String[] args) { Ato转载 2022-02-19 21:31:23 · 161 阅读 · 0 评论 -
JUC-反射与单例模式(十四)
一、饿汉式单例模式: 饿汉式:饥饿的人,看到食物就上来抢。对应在代码中,在类加载时就立刻实例化。public class HungrySingleton { //假如类中存在这样的空间开辟的操作: //使用饿汉式时,不管用不用,上来就给你开了再说,造成空间浪费。 private byte[] data1 = new byte[1024*1024]; private byte[] data2 = new byte[1024*1024]; private b转载 2022-02-18 15:13:06 · 190 阅读 · 0 评论 -
JUC-java内存模型JMM(十三)
文章参考来源https://blog.csdn.net/qq_42191980/article/details/114284797https://blog.csdn.net/zjcjava/article/details/78406330https://blog.csdn.net/u013256816/article/details/51510815?locationNum=8&fps=1一、什么是JMM内存模型可以理解为在特定的操作协议下,对特定的内存或者高速缓存进行读写访问的过程抽象描转载 2022-02-18 10:48:03 · 98 阅读 · 0 评论 -
JUC-异步回调(十二)
1、什么是回调设想一个情景,A是处理业务的一个步骤,A需要解决一个问题,这时候A可以问B,让B来告诉A答案,这期间,A可以继续做自己的事情,而不用因为B做的事而阻塞。于是,我们想到给B设置一个线程,让B去处理耗时的操作,然后处理完之后把结果告诉A。所以这个问题的要点就在于B处理完之后如何把结果告诉A。我们可以直接在A中写一个方法对B处理完的结果进行处理,然后B处理完之后调用A这个方法。这样A调用B去处理过程,B调用A的C方法去处理结果就叫做回调。在正常的业务中使用同步线程,如果服务器每处理一个请求,就创转载 2022-02-17 16:48:28 · 650 阅读 · 0 评论 -
JUC-Fork/Join框架基本使用(十一)
1. 概述ava.util.concurrent.ForkJoinPool由Java大师Doug Lea主持编写,它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。本文中对Fork/Join框架的讲解,基于JDK1.8+中的Fork/Join框架实现,参考的Fork/Join框架主要源代码也基于JDK1.8+。这几篇文章将试图解释Fork/Join框架的知识点,以便对自己、对各位读者在并发程序的设计思路上进行一些启发。文章将首先讲解Fork/Join框架转载 2022-02-16 15:21:17 · 226 阅读 · 0 评论 -
JUC-四大函数式接口和Stream流式算法(十)
一、函数式接口函数式接口:只有一个方法的接口(截至目前用的最多的是Runnable接口)@FunctionalInterfacepublic interface Runnable {public abstract void run();}// 超级多FunctionalInterface// 简化编程模型,在新版本的框架底层大量应用!四大函数式接口:package java.util.function;1.1 Consumer消费型接口/** * Consumer 消费型接口转载 2022-02-13 16:37:10 · 137 阅读 · 0 评论 -
JUC-线程池介绍(九)
一、池化技术在系统开发过程中,我们经常会用到池化技术来减少系统消耗,提升系统性能。说人数: 简单点来说,就是提前保存大量的资源,以备不时之需,池化技术就是通过复用来提升性能。常见池:对象池 通过复用对象来减少创建对象、垃圾回收的开销;连接池 (数据库连接池、Redis连接池和HTTP连接池等)通过复用TCP连接来减少创建和释放连接的时间线程池通过复用线程提升性能使用内存池的优点降低资源消耗。这个优点可以从创建内存池的过程中看出,当我们在创建内存池的时候,分配的都是一块块比较规整的内存转载 2022-01-23 11:23:33 · 356 阅读 · 0 评论 -
JUC-阻塞队列(八)
一、SynchronousQueue 、BlockingQueue在集合中的继承关系BlockingQueue也属于集合中的一员。二、BlockingQueue使用介绍第一组第二组第三组第四组实现结果有返回值会抛异常的方法有返回值但不抛异常的方法线程会阻塞和等待的方法(一直等待)超时等待的方法(过时不候)添加元素add(E e)offer(E e)put(E e)(无返回值)offer(E e, long timeout, TimeUnit unit)移除元素remove()poll()take(转载 2022-01-22 22:06:15 · 89 阅读 · 0 评论 -
JUC-读写锁ReadWriteLock(七)
一、读锁和写锁介绍读锁(共享锁):可多条线程同时获取数据,多个线程可以同时占有写锁(独占锁):只能单条线程写入,一次只能被一个线程占有读锁和写锁是互斥的,加了读锁后,不能再加写锁,保证了读操作的数据原子性;同理,加了写锁不能再加读锁。二、ReentrantReadWriteLock实现读写锁public class TestReadWriteLock { public static void main(String[] args) { //未上锁: //转载 2022-01-22 21:47:40 · 490 阅读 · 0 评论 -
JUC-Callable、FutureTask接口实现原理(六)
一、Callable、FutureTask简单使用示例:public class Test { public static void main(String[] args) throws ExecutionException, InterruptedException { TestCallable testCallable = new TestCallable(); FutureTask<String> futureTask = new FutureTask<>(tes原创 2022-01-19 22:18:30 · 2266 阅读 · 0 评论 -
JUC-辅助类CountDownLatch、CyclicBarrier、Semaphore的使用(五)
一、CountDownLatch顾名思义:倒计时锁存器不管你线程中间执行的情况,结果若是线程执行完了,那就再执行最后语句,如果没达到条件就一直等(领导:不看过程只看结果)public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { // 总数是6,必须要执行任务的时候,再使用! CountDownLatch cou转载 2022-01-19 20:42:25 · 62 阅读 · 0 评论 -
JUC-线程不安全的集合类(四)
一、List不安全public class TestList { public static void main(String[] args) { List<String> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { new Thread(()->{ list.add(UUID.randomUUID().toSt转载 2022-01-18 21:17:43 · 127 阅读 · 0 评论 -
JUC-sysnchronized详解(三)
sysnchronized详解文章目录sysnchronized详解前言特性synchronized 锁重入不具有继承性使用同步静态方法同步普通方法同步代码块锁对象为this锁对象为this.getClass锁对象为变量锁的改变sysnchronized造成的多线程死锁前言线程锁是什么?有什么用?怎么用?先来看一段代码:public class MyService{ private String username = "AA"; private String password原创 2021-04-19 15:51:30 · 274 阅读 · 0 评论 -
JUC-生产者消费者问题(二)
一、synchronized版本案例:对一个数字不停进行 +1 -1操作,加完了减,减完了加public class PC_WithSynchronized { public static void main(String[] args) { Data data = new Data(); new Thread(() -> { for (int i = 0; i < 10; i++) { try转载 2022-01-15 17:30:16 · 121 阅读 · 0 评论 -
JUC-线程基础回顾(一)
一、什么是线程?什么是进程进程:官方定义:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础简单理解:进行(运行)中的程序,如打开任务管理器后中各种.exe程序线程:官方定义:线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。简单理解:线程是真正执行资源转载 2022-01-15 17:06:33 · 122 阅读 · 0 评论