
JUC
文章平均质量分 89
JUC并发
itmkyuan
坚持做难而正确的事情;种一棵树最好的时间是十年前,其次是现在!
展开
-
Runnable、Callable、Future的基础学习
一个方法的计算可能很耗时,这个时候你在计算的过程中我没有必要一直在原地等你,浪费自己的时间,如果遇到一个耗时的方法就很浪费时间,这时让子线程去执行,子线程去执行的时候我可以做其他事情,直到我想要获取你结果的时候再用Future去控制,包括你的任务是否取消、正常运行的结果返回,这一系列结果都可以控制。③ 所以Future是一个存储器,它存储了call()这个任务的结果,而这个任务的执行时间是无法提前确定的,因为这完全取决于call()方法执行的情况。原创 2022-10-19 23:13:31 · 937 阅读 · 0 评论 -
AQS (AbstractQueuedSynshronizer) 在Semaphore、CountDownLatch、ReentrantLock中的应用
③ 这里会先检查剩余许可证数量够不够这次需要的,用减法来计算,如果直接不够,那就返回负数,表示失败,如果够了就用自旋加compareAndSetState来改变state状态,直到改变成功就返回正数,或者是期间如果被其他人修改了导致剩余数量不够了,那就返回负数代表获取失败。由于是可重入的,所以state代表重入的次数,每次释放锁,先判断是不是当前持有锁的线程线程释放的,如果不是就抛出异常,如果是的话,重入次数就减1,如果减到了0,就说明完全释放了,于是free就是true,并且把state置为0。原创 2022-10-18 20:23:35 · 272 阅读 · 0 评论 -
HashMap、ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue基础学习
ConcurrentHashMap:线程安全的HashMapCopyOnWriteArrayList:线程安全的ListBlockingQueue:这是一个接口,表示阻塞队列,非常适合用于作为数据共享的通道ConcurrentLinkedQueue:高效的非阻塞并发队列,使用链表实现,可以看做一个线程安全的LinkedListconcurrentSkipListMap:是一个Map,使用跳表的数据结构进行快速查找1.Vector和Hashtable通过Vector和Hashtable源码,Vector和Ha原创 2022-10-15 22:07:12 · 847 阅读 · 0 评论 -
java控制并发流程CountDownLatch、Semaphore、Condition、CyclicBarrier的基础学习
CyclicBarrier和CountDownLatch的区别① 作用不同:CyclicBarrier要等固定数量的线程都到达了栅栏位置才能继续执行,而CountDownLatch只需等待数字到0,也就是说,CountDownLatch用于事件,但是CyclicBarrier是用于线程的② 可重用性不同:CountDownLatch在倒数到0并触发门闩打开后,就不能再次使用了,除非新建新的实例,而CyclicBarrier可以重复使用原创 2022-10-14 22:47:30 · 808 阅读 · 0 评论 -
java中final关键字怎么使用、有哪些作用
如果对象在被创建以后,状态就不能被修改,那么它就是不可变的创建Person类,设置age和name属性,并且用final修饰}测试显示:如果Person类中有一个属性可变,意味着该对象不具备不可变性具有不变性的对象一定是线程安全的,我们不需要对其采取任何额外的安全措施,也能保证线程安全(final修饰的属性不能改但是可并发读取)原创 2022-10-10 11:44:58 · 1497 阅读 · 0 评论 -
CAS原理是什么,适用场景有哪些,有什么优缺点
1.CAS(Compare And Swap)是一种思想是一种用来实现线程安全的算法,同时也是一组cpu指令。Compare And Swap这一条指令就能完成比较与交换的组合操作,不会被打断,主要运用在并发编程语句,实现那些不能被打断的数据交换操作,从而避免了多线程情况下,出现不可预知的问题2.思路:我认为V的值应该是A,如果是的话,那我就把它改成B,如果不是A(说明被别人修改过了),那我就不修改了,避免多人同时修改导致出错。原创 2022-10-09 17:42:40 · 1070 阅读 · 0 评论 -
什么是原子类,原子类有那些,有什么作用
① 不可分割② 一个操作是不可中断的,即便是多线程的情况下也可以保证④ 原子类的作用和锁类似,是为了保证并发情况下的线程安全。不过原子类相对于锁有一点的优势粒度更细:原子变量可以把竞争范围缩小到变量级别,这是我们可以获得的最细的粒度的情况了,通常锁的粒度都要大于原子变量的粒度效率更高:通常,使用原子类的效率会比使用锁的效率更高,除了高度竞争的情况。原创 2022-10-09 15:08:31 · 2076 阅读 · 2 评论 -
java中的锁(悲观锁、乐观锁、可重入锁、不可重入锁、公平锁、非公平锁、自旋锁、阻塞锁...)
① 锁是一种工具,用于控制对共享资源的访问② Lock和synchronized,这两个是最常见的锁,它们都可以达到线程安全的目的,但是在使用和功能上又有较大的不同③ Lock并不是用来替代synchronized,而是当使用synchronized不合适或不满足要求的时候,来提供高级功能的④ Lock接口最常见的实现类是ReentrantLock。原创 2022-10-08 21:30:59 · 3026 阅读 · 0 评论 -
ThreadLocal原理、作用、内存泄漏及使用场景
2.共享对象:如果在每个线程中ThreadLocal.set()进去的东西本身就是多线程共享的同一个对象,比如sttic对象,那么多个线程的ThreadLocal.get()取得的还是这个共享对象本身,还是有并发访问问题,所以不应该在ThreadLocal中放置静态的对象。ThreadLocal使得代码耦合度更低,更优雅。3.如果可以不使用ThreadLocal就解决问题,那么不要强行使用,例如在任务数很少的时候,在局部变量中就可以新建对象就可以解决问题,那么就不需要使用到ThreadLocal。原创 2022-10-03 22:51:53 · 1234 阅读 · 0 评论 -
关于线程池构造函数参数、阻塞队列、拒绝策略、线程设置的入门学习
1.线程池的重要性2.什么是"池",软件中的"池",可以理解为计划经济3.如果不使用线程池,每个任务都开一个线程处理,① 一个线程② for循环创建线程③ 当任务数量上升到1000这样开销太大,我们希望有固定数量的线程,来执行这1000个线程,这样就避免了反复创建并且销毁线程所带来的开销问题。原创 2022-10-03 16:06:06 · 2268 阅读 · 0 评论 -
JAVA 线程的四种实现(创建方法)
JAVA 线程的四种实现/创建方法1.继承 Thread 类继承Thread 类重写 run() 方法,并调用 start() 方法。Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过 Thread 类的 start() 方法。start() 方法是一个 native 方法,它将启动一个新线程,并执行 run 方法。 package com.thread;/** * java 实现多线程的方式1 * 继承 Thread类 ,原创 2021-10-26 22:34:24 · 129 阅读 · 0 评论