JUC
文章平均质量分 57
Gauss-
这个作者很懒,什么都没留下…
展开
-
ThreadLocal、InheritableThreadLocal 和TransmittableThreadLocal 的区别
描述用途ThreadLocal线程本地变量线程本地存储InheritableThreadLocal可继承的线程本地变量线程本地存储、线程间共享TransmittableThreadLocal (阿里开源的,需要导包)可传递的线程本地变量线程本地存储、线程间共享、线程池共享注:其存储功能体现在Thread,ThreadLocal只能操作本地数据,底层是通过ThreadLocalMap实现的,而ThreadLocalMap类通过key为ThreadLocal类...原创 2022-03-12 19:14:14 · 517 阅读 · 0 评论 -
CAS算法
1.概念CAS是比较并交换,在java并发包中很多都使用到了这种算法,比如currentHashMap、AtomicInteger原子类操作。CAS操作涉及三个值,第一个是预期值、第二个是内存中的值、第三个是即将修改成值,当预期值等于内存中的值,会将即将修改成值,修改带内存中,否则他不做修改。2.举例cout++他不是原子操作 通过字节码(javap -c)可以看出,count++是通过将两个值依次压入栈顶,然后相加再压入栈顶,然后再赋值给count,所以有三个步骤,在多线程的情况下,就会造成cou原创 2022-03-08 22:26:52 · 369 阅读 · 0 评论 -
Runable和Callable区别
1.接口的实现方法不同Runable接口需要实现run方法Callable接口需要实现call方法2.异常情况Runable接口的run()不能抛出异常,只能在方法内部处理Callable接口的call()允许抛出异常3.返回值Runable接口的run()没有返回值Callable接口的call()可以通过futureTask.get()方法获取执行结果,但该方法会阻塞主线程,必须等待子线程执行完成返回结果...原创 2022-03-07 18:44:00 · 678 阅读 · 0 评论 -
fail-safe机制与fail-fast机制
fail-safe机制与fail-fast机制是多线程并发操作下的失败处理机制fail-fast机制表示快速失败比如在集合遍历过程中,发现数据被修改过,就会立刻抛出异常这种常见的集合有ArrayList和hashmap等等fail-safe机制表示失败安全这种机制不会抛出异常,原因是在复制的集合上遍历的。在java.util.concurrent下的包都是这种机制这种常见的有ConcurrentHashMap以及copyOnWriteArrayList等...原创 2022-03-05 12:24:43 · 424 阅读 · 0 评论 -
ThreadLocal源码阅读
set的入口函数过程:获取当前线程获取当前线程属性ThreadLocalMap判断当前线程属性ThreadLocalMap是否为null如果不为空,则直接设置值如果为空,则创建ThreadLocalMap创建ThreadLocalMap调用ThreadLocalMap的有参构建器ThreadLocalMap的有参构建器创建table,也就是给Entry[]赋值。其中,INITIAL_CAPACITY是16通过hashcode&INITIAL_CAPACITY按位于原创 2022-02-05 21:34:47 · 354 阅读 · 0 评论 -
Java 中用到的线程调度算法是什么?
有两种调度模型:分时调度模型和抢占式(java默认使用)调度模型。分时调度模型: 平均分配每个线程占用的 CPU 的时间片。抢占式调度模型: 让优先级高的线程占用CPU,如果线程优先级相同,那么就随机选择一个线程。...原创 2022-02-03 18:49:53 · 1369 阅读 · 0 评论 -
JUC(7) 锁
1. 公平锁和非公平锁概念公平锁:非常公平,线程之间不可以插队非公平锁:非常不公平,线程之间可以插队(默认)比如2ms能比20ms先执行Lock锁源码: //无参构造: 默认非公平锁 /** * Creates an instance of {@code ReentrantLock}. * This is equivalent to using {@code ReentrantLock(false)}. */ public ReentrantLock(原创 2022-01-30 20:28:25 · 78 阅读 · 0 评论 -
JUC(6)单例模式 && CAS
1. 单例模式定义:单例模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。2.单例模式的几种实现方式2.1 饿汉式饿汉式是利用类加载机制来避免了多线程的同步问题,所以是线程安全的。优点:未加锁,执行效率高。缺点:类加载时就初始化实例,造成内存浪费。如果对内存要求不高的情况,还是原创 2022-01-28 23:44:26 · 469 阅读 · 0 评论 -
JUC(5)JMM&&Volatile关键字
1. JMM8种操作执行顺序lock read load use assign store write unlocklock(锁定),作用于主内存中的变量,把变量标识为线程独占的状态。read(读取),作用于主内存的变量,把变量的值从主内存传输到线程的工作内存中,以便下一步的load操作使用。load(加载),作用于工作内存的变量,把read操作主存的变量放入到工作内存的变量副本中。use(使用),作用于工作内存的变量,把工作内存中的变量传输到执行引擎,每当虚拟机遇到一个需要使用到变量原创 2022-01-28 15:44:42 · 91 阅读 · 0 评论 -
JUC(4)线程池(创建方法、七大参数、四种拒绝策略、最大线程数的设置、在Springboot中使用自定义线程池)
1. 线程池优点线程复用、控制最大并发数、管理线程降低资源的消耗提高响应速度方便管理2. Executors创建线程池的方法Executors创建线程池实例常用的几种方法new SingleThreadExecutor()创建单个线程的执行程序。new CachedThreadPool()容量大小可变化。new FixedThreadPool(int nThreads)容量大小固定new ScheduThreadPool()创建一个定时任务线程池线程池关闭的方法pool.shu原创 2022-01-27 21:58:21 · 841 阅读 · 0 评论 -
JUC(3)List、Set、Map集合线程安全&&Callable创建线程&&三大工具类:CountDownLatch减法计数器、CyclicBarrier加法计数器、Semaphore计数信号量
List、Set、Map集合线程安全&&Callable创建线程&&三大辅助工具类:CountDownLatch减法计数器类、CyclicBarrier加法计数器类、Semaphore计数信号量原创 2022-01-26 16:15:15 · 3047 阅读 · 0 评论 -
JUC(2)生产者消费者问题&&锁问题
使用synchronized关键字实现生产者消费者问题步骤:判断是否需要等待业务通知public class Demo { public static void main(String[] args) { Data data = new Data(); // 线程A,进行加1 new Thread(()->{ try { // 10 次操作 fo原创 2022-01-24 18:35:53 · 124 阅读 · 0 评论 -
JUC(1)Lock锁的使用&&Lock锁和Synchronized的区别
ReentrantLock的使用class x(){ Lock lock = new ReentrantLock();//(重入锁) public void xxx(){ lock.lock(); //加锁 try{ //---在这里写业务代码 ---- }catch(Exception e){ e.printStackTrace(); }finally{ lock.unlock(); //解锁 } }}用以下方法使用new Thread(()-原创 2022-01-23 23:58:49 · 261 阅读 · 0 评论