JUC
OVO_LQ_Start
一个弱小的菜鸟在瑟瑟发抖
展开
-
JUC(16)锁
公平锁 ,非公平锁公平锁: 非常公平, 不能够插队,必须先来后到!非公平锁:非常不公平,可以插队 (默认都是非公平)public ReentrantLock() {sync = new NonfairSync();}public ReentrantLock(boolean fair) {sync = fair ? new FairSync() : new NonfairSync();}可重入锁(递归锁)拿到外面的锁 就能自动获取里面的锁public class CASDmeo {原创 2021-01-08 18:24:33 · 249 阅读 · 0 评论 -
JUC(16)原子引用解决ABA问题
如何使用原子引用解决ABA问题?与悲观锁的思想相同。public class CASDmeo { //AtomicStampedReference 注意,如果泛型是一个包装类,注意对象的引用问题 // 正常在业务操作,这里面比较的都是一个个对象 static AtomicStampedReference<Integer> atomicStampedReference = new AtomicStampedRef原创 2021-01-08 18:00:16 · 233 阅读 · 0 评论 -
JUC(15)CAS与ABA问题
1.什么是CASCompare and Swap, 翻译成 比较并交换,是java.util.concurrent.atomic包下的类里面的CompareAndSet()方法。它的功能是判断内存某个位置的值是否为预期值,如果是则更新为新的值,这个过程是原子的。示列:public class CASDemo {// CAS compareAndSet : 比较并交换!public static void main(String[] args) { AtomicInteger atomi原创 2021-01-08 17:46:52 · 147 阅读 · 0 评论 -
JUC(14)单列模式
饿汉式// 饿汉式单例public class Hungry {// 可能会浪费空间private byte[] data1 = new byte[1024*1024];private byte[] data2 = new byte[1024*1024];private byte[] data3 = new byte[1024*1024];private byte[] data4 = new byte[1024*1024];private Hungry(){}private final原创 2021-01-07 20:24:40 · 191 阅读 · 0 评论 -
JUC(13)Volatile
VolatileVolatile 是 Java 虚拟机提供轻量级的同步机制1、保证可见性package com.kuang.tvolatile;import java.util.concurrent.TimeUnit;public class JMMDemo {// 不加 volatile 程序就会死循环!// 加 volatile 可以保证可见性private volatile static int num = 0;public static void main(String[] arg原创 2021-01-07 20:14:49 · 118 阅读 · 0 评论 -
JUC(12)JMM
JMM内存模型可以理解为在特定的操作协议下,对特定的内存或者高速缓存进行读写访问的过程抽象描述,不同架构下的物理机拥有不一样的内存模型,Java虚拟机是一个实现了跨平台的虚拟系统,因此它也有自己的内存模型,即Java内存模型(Java Memory Model, JMM)。他是不存在的,只是一种约定或者规则结构规则JMM规定了所有的变量都存储在主内存(Main Memory)中。每个线程还有自己的工作内存(Working Memory),线程的工作内存中保存了该线程使用到的变量的主内存的副本拷贝,线原创 2021-01-07 19:50:42 · 145 阅读 · 0 评论 -
JUC(11)ForkJion与异步回调实列
ForkJIon1.创建任务/*** 求和计算的任务!* */public class ForkJoinDemo extends RecursiveTask<Long> {private Long start; // 1private Long end; // 1990900000// 临界值private Long temp = 10000L;public ForkJoinDemo(Long start, Long end) {this.start = start;t原创 2021-01-06 21:10:24 · 165 阅读 · 0 评论 -
JUC(10)线程池的三大方法,7大参数与4种拒绝策略
1.线程池线程池(英语:thread pool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务2.池化技术程序的运行的本质:占用系统的资源!优化资源的技术 ===> 池化技术。为什么使用:线程池、连接池、内存池、对象池。。。。创建、销毁。十分浪费资源池化技术:事先准备好一些资源,有人要用,就来池子里拿,用完之后还过来。线程池的好处:降低资源的浪费提高响应的速度方便管理。3. 三大原创 2021-01-06 20:03:08 · 158 阅读 · 0 评论 -
JUC(9)阻塞队列
1.阻塞队列阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。异常:是指当阻塞队列满时候,再往队列里插入元素,会抛出IllegalStateException(“Queue full”)异常。当队列为空时,从队列里获取元原创 2021-01-06 16:58:05 · 117 阅读 · 0 评论 -
JUC(8) ReadWirtelock
ReadWirteLock更加细粒度的读写操作:写入时,独立锁。读取时,共享锁。使用方法类似 ReentrantLockpackage com.liuqing.juc;import java.util.HashMap;import java.util.Map;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.l原创 2021-01-03 17:31:12 · 102 阅读 · 0 评论 -
JUC(7)常用辅助类
1.CountDownLatch减法计数器:public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {// 总数是6,必须要执行任务的时候,再使用!CountDownLatch countDownLatch = new CountDownLatch(6);for (int i = 1; i <=6 ; i++) {new Thread(()-&g原创 2021-01-03 17:04:36 · 204 阅读 · 1 评论 -
JUC(6)简单了解Callable
1.Callable我们常用的创建线程方式一般有下面 2 种:继承Thread,重写run方法实现Runnable接口,重新run方法其实在 Executor 框架中还有一种方法可以实现异步,那就是实现 Callable 接口并重写call方法。虽然是实现 Callable ,但是在 Executor 实际运行时,会将 Runnable 的实例或 Callable 的实例转化为 RunnableFuture 的实例,而 RunnableFuture 继承了 Runnable 和 Future 接原创 2021-01-03 16:49:35 · 191 阅读 · 0 评论 -
JUC(5)安全的并发集合类
1.CopyOnWriteArrayListList集合在单线程时是安全的,但多线程的情况下是不安全的。public class ListTest { public static void main(String[] args) { List<String> list = new ArrayList<>(); for (int i = 0; i <= 10; i++) { new Thread(()->原创 2021-01-03 16:27:48 · 164 阅读 · 0 评论 -
JUC(4) 8锁现象
转载文章:8锁转载 2020-12-25 16:16:53 · 243 阅读 · 0 评论 -
JUC(3)condition
1. 生产者与消费者问题主要是包含了两类线程,一种是生产者线程用于生产数据,另一种是消费者线程用于消费数据,为了解耦生产者和消费者的关系,通常会采用共享的数据区域,就像是一个仓库,生产者生产数据之后直接放置在共享数据区中,并不需要关心消费者的行为;而消费者只需要从共享数据区中去获取数据,就不再需要关心生产者的行为。但是,这个共享数据区域中应该具备这样的线程间并发协作的功能:1.如果共享数据区已满的话,阻塞生产者继续生产数据放置入内;2.如果共享数据区为空的话,阻塞消费者继续消费数据;从上面可知道,生原创 2020-12-25 16:10:52 · 109 阅读 · 0 评论 -
JUC(2)Lock锁
LOCK锁当多个线程需要访问某个公共资源的时候,我们知道需要通过加锁来保证资源的访问不会出问题。java提供了两种方式来加锁,一种是关键字:synchronized,一种是concurrent包下的lock锁。synchronized是java底层支持的,而concurrent包则是jdk实现。LOCK锁的使用方式三步:1、 new ReentrantLock(); 2、 lock.lock(); (加锁) 3、 finally=> lock.unlock(); // (解锁)packag原创 2020-12-24 18:05:34 · 177 阅读 · 1 评论 -
JUC(1)J UC初步了解
1.什么是JUCJUC指的是:java.util 工具包、包、分类(java.util.concurrent,java.util.concurrent.atomic、java.util.concurrent.locks)实现多线程共有三种方式,我们传统的是:继承Thread类实现Runnable接口实现Callable接口使用实现Runnable接口的方式,代码没有返回值,效率相比较于实现Callable也比较低现在可以使用上面所说的三种工具包实现多线程。2.线程与进程进程:一个程序,原创 2020-12-24 17:51:28 · 660 阅读 · 1 评论