Java多线程与高并发
GZ-豆浆油条
嘿!今天的你 过得还好吗?
展开
-
Java多线程与高并发目录
学习路径脑图底层原理JMM安全发布对象不可变对象并发容器线程基础线程简介死锁线程的start()和run()方法的区别JUC原子类原子类AQSAQSAQS协同工具类并发工具 Semaphore并发工具 CountDownLatch并发工具 CyclicBarrier拓展ConditionCondition线程池线程池拓展获取子线程的执行结果锁同...原创 2020-05-03 16:24:39 · 201 阅读 · 0 评论 -
AQS
前言AQS (AbstractQueuedSynchronizer)成为同步容器,主要用于构建锁或者其他同步组件的基础框架。通过维护一个共享状态(Volatile int state )和一个先进先出的线程等待队列来来实现一个多线访问共享的资源同步框架。这些同步框架有哪些呢?我们JUC中常用到的ReentrantLock、ReentrantReadWriteLock、CountDownLatch...原创 2020-04-13 21:04:14 · 190 阅读 · 0 评论 -
并发工具 CyclicBarrier
定义CyclicBarrier:Cyclic(循环),Barrier(屏障)。循环屏障或者循环栅栏,它的功能就是,让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会打开,此时被阻塞的线程就会继续执行。当线程调用CyclicBarrier的await()方法后,相当于告诉CyclicBarrier我到达了屏障,然后当前线程就会被阻塞。应用场景CyclicBarrier可以用于...原创 2020-04-12 20:20:49 · 120 阅读 · 0 评论 -
获取子线程的执行结果
创建线程有哪几种方式继承Thread类(Thread类也是实现Runnable接口);publicclass Thread implements Runnable {实现Runnable接口;通过线程池创建线程池;实现Callable接口与ExecutorService结合使用因为Java的类是单继承,接口可以多实现。所以在创建子任务的时候,更多的是选择实现接口。线程池的出...原创 2020-04-10 12:11:17 · 821 阅读 · 0 评论 -
原子类
背景对于Atomic介绍,网上不缺好的文章,但是都是别人精心咀嚼过的。自己也尝试整理一下,方便今后自己回顾学习。JDK版本:1.8简介谈及原子类,第一感觉就是为了线程安全。线程安全性的三大特性是:原子性、可见性、有序性。原子性:提供了互斥访问,同一个时刻只能有一个线程来操作;可见性:一个线程对主内存的修改可以及时被其他线程察觉到;有序性:一个线程观察其他线程中的指令执行顺序,由于指...原创 2020-03-25 10:43:33 · 143 阅读 · 0 评论 -
线程的start()和run()方法的区别
以下通过两个实例代码,比较start()和run()方法的区别:示例一:调用start()方法public class StartAndRun { public static void main(String[] args) { Thread thread = new Thread(new Runner(), "thread-1"); thread.s...原创 2020-03-08 14:42:15 · 366 阅读 · 0 评论 -
线程简介
一 什么是线程?1.1 程序、进程、线程之间的关系当我们的电脑运行一个程序的时候,就会创建对应的进程,在一个进程里面可以有多个线程。进程是资源分配的最小单位,线程是CPU调用最小单元,每个线程都拥有自己的计数器,堆栈,局部变量等属性。1.2 Java中线程我们写Java代码的时候,在hello world之前,需要定义好main函数,main函数作为java程序的入口,执行mian()方法...原创 2020-03-08 13:06:30 · 152 阅读 · 0 评论 -
并发工具 Semaphore
定义Semaphore :信号量,并发控制中用于控制某个资源同时被访问的个数。例如程序中某个方法执行耗时长,所需资源量大。可以通过Semaphore控制同一时刻访问该方法的线程数。主要方法public Semaphore(int permits) :构造函数一,permits为信号量许可证的大小;public Semaphore(int permits, boolean fair) :构...原创 2020-02-03 16:46:18 · 184 阅读 · 0 评论 -
线程池
背景我们知道使用new Thread也可以启动一个新的线程,但是以这种方式启动多线程有以下的几种缺点每次启动一个线程的时候都需要new Thread来新建对象,性能差;线程缺乏统一的管理;这种方式启动的线程缺少更多的功能,如多执行,定时调度,线程中断。使用线程池的好处重用存在的线程,减少对象的创建、消亡的开销;可以有效地控制线程的并发数目;提供定时执行、定期执行等功能...原创 2018-08-08 21:16:56 · 186 阅读 · 0 评论 -
并发容器
Mapdemo1package com.mark.example.concurrent;import com.mark.annotations.ThreadSafe;import lombok.extern.slf4j.Slf4j;import java.util.HashMap;import java.util.Map;import java.util.concurre...转载 2018-08-13 12:05:56 · 550 阅读 · 1 评论 -
JMM
以下内容摘抄于《深入理解Java虚拟机》第二版中的第十二章什么是JMM?JMM(Java Memory Model):Java内存模型,JVM中规范通过JMM来屏蔽掉各种硬件之间和操作系统之间的访问差异,以实现Java程序在各个平台下都能达到一致的内存访问效果(平台无关性)。JMM的作用? Java内存模型的主要目的是定义程序中各个变量(这里的变量是指实例字段、静态字段和构成数...转载 2018-08-08 16:01:46 · 1111 阅读 · 0 评论 -
线程封闭
多线程环境中也可以通过线程封闭实现线程安全。 实现线程封闭的方式有:堆栈封闭:如果可以的话,将共享变量声明在方法中,即声明为局部变量,因为局部变量存放在栈中,线程私有,不会发生线程共享;ThreadLocal线程封闭。java.lang.ThreadLocal类可以实现线程本地存储的功能。每一个线程的Thread对象中都有一个ThreadLocalMap对象,该对象存储了以Thre...转载 2018-08-09 17:15:41 · 174 阅读 · 0 评论 -
synchronized
部分内容摘抄于《深入理解Java虚拟机》1.互斥同步同步是指在多个线程并发访问共享数据的时候,保证共享数据在同一个时刻只能被一个线程使用。而互斥是实现同步的一种手段;临界区、互斥量、信号量都是实现互斥的方式。在Java中使用synchronize、JUC包的锁来实现互斥同步。synchronize在Java中synchronize经过编译后,会在同步语句块形成monitor...原创 2019-06-30 11:25:11 · 198 阅读 · 0 评论 -
JUC_Condition
转载于:《Java多线程编程核心技术》使用多个Condition实现通知部分线程 错误用法package test.Thread4;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.Reentran转载 2018-01-08 14:39:25 · 227 阅读 · 0 评论 -
JUC_Condition
关键字synchronize关键字通过wait()、notify()、notifyAll()方法相结合来实现等待、通知。在ReentrantLock中通过Condition对象实现该功能。一个Lock对象可以创建多个Condition(对象监视器)实例,线程对象可以注册在指定的Condition中,从而可以有选择性的进行线程的通知。而notify()、notifyAll()方法的通知是由JVM随机...原创 2018-08-09 22:50:04 · 253 阅读 · 0 评论 -
并发工具 CountDownLatch
CountDownLatch:闭锁 一个线程等待多个线程执行完。才继续自己的操作;可以使用闭锁来保证某些活动到其他活动做完才继续进行应用 1. 确保计算机在其需要的所有资源被初始化之后才继续执行; 2. 确保某个服务在其依赖的所有其他服务都已经启动之后才启动; 3. 等待直到某个操作所有参与者都准备就绪了继续操作。demo1package com.mark.examp...原创 2018-08-09 23:03:01 · 173 阅读 · 0 评论 -
死锁
死锁什么是死锁? 简单去个例子,前提:两个线程共享的对象o1和o2,线程A和线程B。 如果线程A先锁住o1然后锁住o2,线程B先锁住o2然后锁住o1, 但是问题关键是:如果线程A锁住了o1,线程B同时锁住了o2; 那么会导致线程A没办法锁住o2,线程B没办法锁住o1,那么线程A、B互相等待对象释放锁,而发生了死锁。死锁demopackage com.mark.examp...原创 2018-08-07 22:44:23 · 150 阅读 · 0 评论 -
线程安全之不可变对象
以下内容装载于 慕课网《Java并发编程与高并发解决方案》 《深入理解java虚拟机》第二版,386页~387页1.什么是不可变对象?不可变对象一定是线程安全的,因为无论是方法的实现者还是调用者,都不需要采用任何的线程安全保护措施;不可变对象一经创建以后他的状态就不能被改变,对象的所有域都是final类型的;对象是正确创建的(在创建对象的期间没有发生,this引用逸出)。2.声明不...原创 2020-03-26 09:11:26 · 314 阅读 · 0 评论