JUC并发编程
JUC并发编程
一只小小狗
大家好我是练习时长2年半的程序员
展开
-
Redis实现分布式锁
比如:1000个锁,分成10段,每一段100个锁,每一段对应一个Redis实例。(每个锁的名字都叫Product_id_1…Product_id_n),欢迎大家加入我的开源项目,或者(在我的主页联系我)加入你们的开源项目,点点Github-Stars。setnx: 如果key不存在,则设置key的值为value,返回1;如果key已经存在,则返回0。通过Redis的setnx命令来实现分布式锁。原创 2024-03-10 16:44:01 · 1048 阅读 · 0 评论 -
Synchronized代码块锁的是什么?全局锁?对象锁?
对象锁:锁的是这个对象。全局锁:锁的是那个写了synchronized关键字的方法或者代码块。这里主要去聊全局锁当java关键字 Synchronized()代码块锁随便的一个类比如,Integer.class时(或者一个静态变量(前提是不改变指向))比如下列代码package cn.com.demo.utils;import lombok.Getter;import java.util.stream.IntStream;/** * @author JMWANG */pu.原创 2022-02-25 16:50:43 · 974 阅读 · 0 评论 -
非静态方法上加 Synchronized
Synchronzied 修饰非静态方法==》对象锁Synchronzied 修饰静态方法==》其实是类锁,因为是静态方法,它把整个类锁起来了;什么时候选择在非静态方法上Synchronzied ?首先我们要知道,加载非静态方法上是对象锁,一个class类模板可以复制出无数的类,也就是说在非静态方法上加Synchronzied ,只能达到当前的这个类中的各种操作是线程安全的。多个线程同时操作一个对象为前提。以下列代码为例:@Slf4jpublic class TesThread { v原创 2022-02-24 13:59:16 · 411 阅读 · 0 评论 -
ThreadLocal 线程重用导致数据串行问题(查看访问的ip地址)
当使用ThreadLocal中来缓存当前线程信息的时候,由于不断创建销毁线程是一个很大的开销,我们会使用线程池来管理闲置的线程,线程池中的线程是固定的,多线程的状态下会将同一个线程不断的重用。这样我们用线程来缓存数据信息的时候。顾名思义,线程池会重用固定的几个线程,一旦线程重用,那么很可能首次从ThreadLocal 获取的值是之前其他用户的请求遗留的值。这时,ThreadLocal 中的用户信息就是其他用户的信息。测试代码private final ThreadLocal<String>原创 2022-02-23 17:11:42 · 822 阅读 · 0 评论 -
CopyOnWriteXXX(ArrayList等)适用场景-并发容器
顾名思义:写时复制。CopyOnWriteXXX是线程安全的集合,比如CopyOnWriteArrayList 就是去代替ArrayList很好的选择。但是CopyOnWriteXXX更多的时候特殊情况下的高级集合。为什么适用起来,效率低下?特殊情景,由于CopyOnWriteArrayList 是线程安全,在经常会大量写入的情况下我使用了CopyOnWriteArrayList ,但是在性能测试的时候发现此步骤的消耗远远超出了预期时间。在大量写入的时候,会进行大量的数据复制操作,也就是创建一个原创 2022-02-23 11:22:36 · 464 阅读 · 0 评论 -
各种锁的理解
锁1.公平锁 非公平锁2.可重入锁2.1 synchronized 是通一把锁2.2 lock 是不同的锁3.自旋锁4.死锁1.公平锁 非公平锁公平锁:公平,不允许插队非公平锁:不公平,允许插队(默认为非公平)2.可重入锁2.1 synchronized 是通一把锁2.2 lock 是不同的锁package JUC;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLoc原创 2021-01-24 16:03:42 · 124 阅读 · 0 评论 -
死锁
死锁4.1 死锁的四个条件1.互斥条件:一个资源每次只能被一个进程使用。2.请求与保持条件:一个进程因请求资源而阻塞时,对资源保持不放3.不掠夺条件:进程已获得的资源,在未使用完前,不允许掠夺。4.循环等待条件:若干进程之间形成一个头尾相连的闭环。package JUC;import java.util.concurrent.TimeUnit;public class DeadLockTest { public static void main(String[] args) {原创 2021-01-24 16:03:16 · 83 阅读 · 0 评论 -
自旋锁
自旋锁只要不找到期望值, 就会一直循环。package JUC;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicReference;/** * 自旋锁 */public class Demo2 { AtomicReference<Thread> atomicReference = new AtomicReference<>(); // 加锁 pu原创 2021-01-24 16:02:18 · 84 阅读 · 0 评论 -
可重入锁
可重入锁2.1 synchronized 是通一把锁2.2 lock 是不同的锁package JUC;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 可重复锁 */public class Demo01 { public static void main(String[] args) { Phonee phonee = new Ph原创 2021-01-24 16:01:20 · 70 阅读 · 0 评论 -
公平锁 非公平锁
公平锁 非公平锁公平锁:公平,不允许插队非公平锁:不公平,允许插队(默认为非公平)原创 2021-01-24 15:59:49 · 107 阅读 · 1 评论 -
深入理解CAS
深入理解CAS1.什么是CAS?2.ABA问题 (乐观锁)(狸猫换太子)AtomicInteger3.原子引用 解决ABA问题(乐观锁) AtomicStampedReference如果泛型是包装类,注意对象引用问题1.什么是CAS?CAS:比较当前工作内存中的值和主内存的值,如果这个值是期望的,那么则执行操作!,如果不是就一直循环。缺点: 1.循环会耗时 2.一次性只能保证一个共享变量的原子性 3.ABA问题CAS 是CPU的并发原语。Unsafe类2.ABA问题 (乐观锁)(狸原创 2021-01-23 17:56:14 · 142 阅读 · 0 评论 -
单例模式
单例模式1.饿汉式2.懒汉式2.1反射破坏单例2.2改良懒汉式单例 (三重检测)2.3改良单例信号灯法2.4破坏单例信号灯3.使用枚举 保护单例模式(防止反射攻击)3.1为什么枚举可以保护 单例模式?3.2 枚举创建单例3.3查看底层 反编译3.4 使用jad.exe4.总结饿汉式 DCL懒汉式1.饿汉式package JUC;/** * 饿汉式 浪费内存 */public class SingletonHungry { private byte[] data1 = new byte[原创 2021-01-23 17:01:48 · 159 阅读 · 4 评论 -
Volatile禁止指令重排
Volatile禁止指令重排什么是指令重排?你写的程序,计算机并不是按照你写的那样去执行的。源代码 -> 编译器优化的重排 -> 指令并行可能会重排 -> 内存系统可能会重排 -> 执行处理器在进行指令重排的时候,考虑,数据之间的依赖性!指令重排 不会造成影响的例子int x = 1;//1int y = 2;//2x = x + 5;//3y = x * x;//4我们所期望的: 1234 执行的时候可能会变成 2134 1324 但是不可能是 4321原创 2021-01-23 15:48:17 · 315 阅读 · 0 评论 -
AtomicXXX JUC保证原子性
1.如果不加synchronized如何保证原子性操作?使用原子类 AtomicXXX原子类底层都直接和操作系统挂钩!(效率更高)java.util.concurrent.atomic;包下子类原创 2021-01-23 15:31:01 · 111 阅读 · 0 评论 -
JMM
JMM1.Volatile是什么?2.JMM java内存模型(是概念不是约定)3.内存交互操作4.JMM对这八种指令的使用,制定了如下规则:1.Volatile是什么?Volatile是java虚拟机提供轻量级同步机制1.保证可见性2.不保证原子性3.禁止指令重排2.JMM java内存模型(是概念不是约定)JMM同步约定:1.线程解锁前,必须把共享变量 立刻 刷回主存。2.线程加锁前,必须读取主存中的最新值到工作内存中。3.加锁和解锁是同一把锁。工作内存 主内存8中操作3.原创 2021-01-23 15:13:52 · 163 阅读 · 0 评论 -
Volatile可见性及非原子性验证
1.测试(可见性)1.1 代码public class JMMTest { private static int num = 0; public static void main(String[] args) { new Thread(()->{ while (num==0) { } }).start(); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) {原创 2021-01-23 15:13:20 · 103 阅读 · 0 评论 -
Stream流 (全方位 分析源码)
Stream并行流原创 2021-01-23 01:15:08 · 1082 阅读 · 1 评论 -
异步回调CompletableFuture实现Future接口
异步回调 Future 接口在 Java 5 中被引入,设计初衷是对将来某个时刻会发生的结果进行建模。它建模了一种异步计算,返回一个执行运算结果的引用,当运算结束后,这个引用被返回给调用方。在Future中触发那些潜在耗时的操作把调用线程解放出来,让它能继续执行其他有价值的工作,不需要等待耗时的操作完成。没有返回值的runAsync 异步回调 public static void main(String[] args) { // (没有返回值的runAsync 异步回调) Comp原创 2021-01-22 20:32:40 · 388 阅读 · 0 评论 -
ForkJoin分支合并
ForkJoin分支合并什么是ForkJoinForkJoin在JDK1.7 ,并行执行任务!提高效率,大数据量大数据:Map Reduce(把大任务拆分成小任务)ForkJoin特点工作窃取: (这个里面维护的都是双端队列)ForkJoin 例子去继承其中一个使用的需要继承RecursiveTask而RecursiveTask 继承了ForkJoinTask1.具体代码ForkJoin应用package JUC;import java.util.concurrent原创 2021-01-22 18:16:52 · 178 阅读 · 1 评论 -
Stream流式计算
Stream流式计算什么是Stream流式计算?大数据:存储+计算集合 MySQL 本质就是存储东西的计算都应该交给流来操作例子 主要是查看哪些流方法中的函数式接口是哪些package JUC;import java.util.Arrays;import java.util.List;/** * 一行代码实现 * 5个用户筛选 * 1.ID必须是偶数 * 2.年龄必须大于17 * 3.用户名转为大写字母 * 4.用户名字倒着排序 * 5.只输出一个用户 */pub原创 2021-01-22 17:06:24 · 309 阅读 · 1 评论 -
四大函数式接口
四大函数式接口函数式接口Function接口 (函数型接口) 传入一个参数,返回一个参数Predicate接口 (断定型接口)传入一个参数,返回BooleanConsumer接口(消费型接口)传入一个参数Supplier(供给型接口) 返回一个参数lambda表达式链式编程Stream式计算 函数式接口函数式接口@FunctionalInterfacepublic interface Runnable { public abstract void run();}//简化编程模型原创 2021-01-22 16:35:39 · 114 阅读 · 0 评论 -
线程池中最大线程如何定义? CPU密集型和IO密集型
线程池中最大线程如何定义? CPU密集型和IO密集型1.CPU密集型 几核 就是一个 保持CPU效率最高ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor( 2, Runtime.getRuntime().availableProcessors(), 2, TimeUnit.SECONDS, new LinkedBlockingDeque<>(3), Executors.d原创 2021-01-22 16:00:28 · 784 阅读 · 0 评论 -
线程池ThreadPoolExecutor (三大方法、7大参数、四种拒绝策略)
线程池线程池的好处:线程池三大方法Executors.newSingleThreadExecutor()单个线程池Executors.newFixedThreadPool(5)固定线程池Executors.newCachedThreadPool()缓存 可伸缩7大参数int corePoolSize, //核心线程大小int maximumPoolSize, //最大线程大小long keepAliveTime, //超时释放时间TimeUnit unit, //超时单位BlockingQueue wo原创 2021-01-22 15:06:44 · 675 阅读 · 0 评论 -
同步队列SynchronousQueue 不存储
同步队列SynchronousQueue没有容量,进去一个元素,必须等待取出来之后,才能往里放一个元素!/* * 同步队列 * SynchronousQueue 和其他的BlockingQueue 不一样, * SynchronousQueue不存储元素 */public class SynchronousQueueTest { public static void main(String[] args) { SynchronousQueue<String> queue =原创 2021-01-22 13:56:18 · 172 阅读 · 0 评论 -
阻塞队列BlockingQueue 四组API
阻塞队列BlockingDueue关系 等实现类BlockingDueue四组API抛出异常不会抛出异常阻塞等待超时等待方式抛出异常有返回值,不会抛出异常阻塞等待超时等待添加add()offe()rput()offer(object , long , TimeUnit)移除remove()poll()take()poll(long , TimeUnit)检测队首元素element()peek()--例子:pac原创 2021-01-21 20:00:45 · 115 阅读 · 2 评论 -
ReadWriteLock读写锁
ReadWriteLock读写锁ReadwriteLock维护一对关联的locks , 一个用于只读操作,一个用于写入。read lock可以由多个阅读器线程同时进行,只要没有作者。write lock是独家的。public class ReadWriteLockTest { public static void main(String[] args) { MyCache cache = new MyCache(); for (int j = 1; j <= 5; j++) {原创 2021-01-21 19:03:38 · 153 阅读 · 2 评论 -
JUC辅助类 CountDownLatch CyclicBarrier Semaphore
JUC辅助类CountDownLatch 减法计数器CyclicBarrier 加法计数器Semaphore 信号量 (限流)CountDownLatch 减法计数器public class A { public static void main(String[] args) { //总数是6,必须要执行的任务的时候 使用 CountDownLatch countDownLatch = new CountDownLatch(6); for (int i = 0; i < 6;原创 2021-01-21 18:42:07 · 116 阅读 · 0 评论 -
Callable接口 JUC并发编程
Callable接口FutureTask使用Callable接口 并且实现了RunnableFutureRunnableFuture继承了RunnableThread实现了Runnable接口public class CallableTest { public static void main(String[] args) { MyThread myThread = new MyThread(); //适配类 FutureTask<String> futu原创 2021-01-21 17:52:09 · 73 阅读 · 0 评论 -
ConcurrentHashMap
ConcurrentHashMap 并发public class ListMap { /** * 并发下 HashMap不安全 * 解决方案: * 1.Map<String, String> map = Collections.synchronizedMap(new HashMap<>()); * 2.Map<String, String> map = new ConcurrentHashMap<String, String>()原创 2021-01-21 16:44:53 · 171 阅读 · 0 评论 -
CopyOnWriteArraySet
CopyOnWriteArraySetpackage JUC;import java.util.Set;import java.util.UUID;import java.util.concurrent.CopyOnWriteArraySet;/** * Set<String> set = new HashSet<>();集合不全安 * 解决方案: * 1.Set<String> set = Collections.synchronizedSet(原创 2021-01-21 16:33:02 · 83 阅读 · 0 评论 -
CopyOnWriteArrayList 集合类解决不安全
CopyOnWriteArrayList集合类不安全/** * java.util.ConcurrentModificationException 并发修改异常 */public class ListTest { /** * 并发下 ArrayList不安全 * 解决方案: * 1.List<String> list = new Vector<>(); 内部synchronized 效率太低 * 2.List<String> li原创 2021-01-21 16:22:18 · 122 阅读 · 0 评论 -
8锁现象
8锁现象1.synchronized锁的对象是方法的调用者,两个方法用的是同一个锁,谁先拿到谁先执行2.这先后是锁的问题,那个线程先拿到3.当增加了一个普通方法,不受锁的影响,先执行4.多个对象跑不同线程,他们的线程不存在抢夺资源,同时进行(2把锁)5.增加个静态同步方法 static 静态方法(锁的是Class,全局唯一)6.两个对象! 两个静态同步方法,两个对象的Class模板只有一个,static锁的是Class7. 一个静态同步方法(锁的是Class模板),一个普通同步方法(锁的是Phone对象),原创 2021-01-21 14:31:14 · 223 阅读 · 1 评论 -
Condition实现精确通知唤醒
Condition实现精确通知唤醒package JUC;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * Copyright © 2021 eSunny Info. Tech Ltd. All rights reserved. * * 功能描述: * @P原创 2021-01-21 13:56:37 · 112 阅读 · 0 评论 -
生产者消费者问题、防止虚假唤醒
传统生产者消费者问题、防止虚假唤醒package JUC;/** * Copyright © 2021 eSunny Info. Tech Ltd. All rights reserved. * * 功能描述:生产者 * 操作同一个变量 通知等待唤醒 * Provider num + 1 * Consumer num - 1 */public class ProviderConsumer { public static void main(String[] args) {原创 2021-01-20 16:14:47 · 139 阅读 · 1 评论 -
ReentrantLock 可重复锁
ReentrantLock 可重复锁 实现 Lock接口(非)公平锁 ReentrantLock公平锁:可以先来后到非公平锁:可以插队原创 2021-01-20 15:45:00 · 284 阅读 · 0 评论 -
传统Synchronized
传统Synchronized传统Synchronized :去使用需要一种解耦思想package JUC;/** * Copyright © 2021 eSunny Info. Tech Ltd. All rights reserved. * * 功能描述:买票 * 公司中真正的多线程开发: * 线程就是一个单独的资源类,没有任何的附属操作,降低耦合性 * 1. 属性 方法 */public class SaleTicketDemo01 { public stat原创 2021-01-20 15:21:43 · 68 阅读 · 0 评论 -
JUC是什么?
JUC是什么?java.util.concurrent在并发编程中使用的工具类原创 2021-01-20 14:41:34 · 109 阅读 · 0 评论