多线程与高并发
文章平均质量分 94
艺术与技术共舞
技术咖也可以有艺术的人生。
展开
-
多线程与高并发(五)--AQS源码阅读与强软弱虚4种引用以 及ThreadLocal原理与源码
一、通过ReentrantLock来解读AQS源码 1.1.什么是AQS? AQS最核心的是它的一个共享的int类型值叫做state,这个state用来干什么,其实主要是看他的子类是怎么实现的,比如ReentrantLock这个state是用来干什么的?拿这个state来记录这个线程到底重入了多少次,比如说有一个线程拿到state这个把锁了,state的值就从0变成了1,这个线程又重入了一次,state就变成2了,又重入一次就变成3等等,什么时候释放了呢?从3变成2变成1变成0就释放了,这个就是AQS原创 2021-10-20 11:36:36 · 95 阅读 · 0 评论 -
多线程与高并发(四)--LockSupport、淘宝面试题与源码阅读方法论
一、LockSupport 1.传统方法的局限性 以前我们要阻塞和唤醒某一个具体的线程有很多限制 1、因为wait()方法需要释放锁,所以必须在synchronized中使用,否则会抛出异常IllegalMonitorStateException 2、notify()方法也必须在synchronized中使用,并且应该指定对象 3、synchronized()、wait()、notify()对象必须一致,一个synchronized()代码块中只能有一个线程调用wait()或notify() 2.L原创 2021-09-16 15:26:43 · 135 阅读 · 0 评论 -
多线程与高并发(三)--Atomic类和线程同步新机制
一、什么是无锁操作? 举个例子 模拟我们计一个数,所有的线程都要共同访问这个数count值,大家知道如果所有线程都要访问这个数的时候,如果每个线程给它往上加了10000,你这个时候是需要加锁的,不加锁会出问题。但是,你把它改成AtomicInteger之后就不用在做加锁的操作了,因为incrementAndGet内部用了cas操作,直接无锁的操作往上递增,无锁的操作效率会更高。 /** * 解决同样的问题的高效方法,使用AtomXXX类 * AtomXXX类的本身方法都是原子性的,但不能保证多个原创 2021-09-06 17:07:12 · 296 阅读 · 0 评论 -
多线程与高并发(二)--volatile与CAS
一、 volatile关键字 volatile 关键字,使一个变量在多个线程间可见。 特性1:保证线程的可见性 举个例子 /** * volatile 关键字,使一个变量在多个线程间可见 * A B线程都用到一个变量,java默认是A线程中保留一份copy,这样如果B线程修改了该变量,则A线程未 必知道 * 使用volatile关键字,会让所有线程都会读到变量的修改值 ** 在下面的代码中,running是存在于堆内存的t对象中 * 当线程t1开始运行的时候,会把running值从内存中读原创 2021-08-28 18:13:27 · 248 阅读 · 0 评论 -
多线程与高并发(一)--线程的基础概念
一、什么是线程? 一个程序里不同的执行路径就是一个线程,是进程里面最小的执行单元。 例子: public class test { private static class T1 extends Thread { @Override public void run() { for (int i = 0; i < 10; i++) { try { TimeUn原创 2021-08-25 17:57:13 · 170 阅读 · 0 评论