
多线程与高并发
文章平均质量分 64
NoloseWind
From zero to hero.
展开
-
Disruptor简单理解 QPS TPS 压力测试JMH使用
QPS Query per Second 每秒查询率,也就是一个接口每秒可以执行多少次 TPS Transactions per Second 每秒传输事务的个数,也就是服务器每秒处理的事务数 JMH 测试一个方法的性能 官方建议打好jar包放去服务器中测试,开发环境会对测试结果有影响 需要写在test包下 JMH注解@Benchmark • 在方法上添加,就可以进行测试 @Warmup • 预热,对于测试结果很重要,由于JVM中对于特定代码会存在优化(本地化) • 参数: Iteratio原创 2021-11-23 10:36:44 · 703 阅读 · 0 评论 -
线程池 ThreadPoolExcutor和ForkJoinPool
Excutor 执行器接口,execute是执行方法, 使定义和运行可以分开,运行的方式可以自己去定义 ExcutorService 除了执行任务之外,还完善了整个任务执行的生命周期 submit方法为异步方法,返回值为Future,Future中的get可以获取线程执行的返回值,如果没有返回值,该方法会阻塞 CompletableFuture 各种线程任务的管理类 提供了四个静态方法来创建一个异步操作,以及四个计算完结果后的回调方法 线程池 线程池分为两类,分别是ThreadPoolExcu原创 2021-11-23 10:12:49 · 662 阅读 · 0 评论 -
JUC高并发容器 BlockingQueue ConcurrentHashMap
容器 - Conllection ○ List ArrayList LinkedList CopyOnWriteList Vector Stack ○ Set HashSet LinkedHashSet TreeSet CopyOnWriteArraySet SortedSet EnumSet ConcurrentSkipListSet ○ Queue Deque □ ArrayDeque □ BlockingQ原创 2021-11-23 10:06:08 · 1031 阅读 · 0 评论 -
JUC同步锁 同步工具类 AQS底层
JUC同步锁 1. LongAdder 分段锁,分为片断来上锁 也就是把不同的线程进行分组,最后再进行统计加和 底层每个线程也是CAS操作 2. ReentrantLock lockInterruptibly:表示抢锁的时候,可以被设标志位打断抢锁 Condition:本质就是等待队列,ReentrantLock可以有多个等待队列,用于执行不同的事情 公平锁与不公平锁 ○ 默认是非公平锁,可以传入一个boolean来决定 ○ 公平锁是指才来的线程需要去队列排队,不能直接抢锁,保证线程获取到资源的概原创 2021-11-23 01:10:18 · 122 阅读 · 0 评论 -
强软弱虚引用 ThreadLocal
强引用 A a = new A();就是强引用 可以重写finalize来测试,当没有引用指向这个对象时,就会被回收 软引用 一个对象,如果是软引用指向它,那只有在内存不够用的情况下,才会回收它,内存够的情况下不会回收 设置jvm参数 -Xms20M -Xmx20M配合SoftReference来测试,堆内存不够了才会回收 软引用主要用作缓存 弱引用 只要遭遇到GC垃圾回收就会被回收 如果有一个强引用和一个弱引用同时指向一个对象,只要强引用消失,这个对象就会被回收 可以防止内存泄漏,一般用在容器中原创 2021-11-23 01:00:37 · 171 阅读 · 0 评论 -
Java并发编程三大特性 对象的内存布局 volatile底层实现
可见性(visibility) 概念:可见性是指一个线程对共享变量进行修改,另外的线程可以立即得到修改后的新值 a.前置知识 - 一台机器的多颗CPU可以共享主存,但是CUP的一个核同一时刻只能运行一个线程 - CPU中有三级缓存,分别为L1,L2,L3 - L1和L2位于CPU核的内部,L3位于CPU的内部 - 缓存以缓存行(cache line)为单位来读取数据,根据空间局部性和时间局部性,一行是64字节 - 寄存器找数据,会先从L1-L2-L3去找,如果没有,才会去主存里面找 b.缓存一致原创 2021-11-23 00:37:42 · 414 阅读 · 0 评论 -
synchronized锁升级过程 悲观锁 乐观锁 偏向锁 MarkWord锁标识位
synchronized基础概念 要完成原子性操作,只能靠锁来实现 上锁的本质就是把并发操作转变为序列化操作 修饰方法锁的是对象,修饰静态方法锁的是类的class,class只有一个 抛出异常,锁会被释放 synchronized锁对象时不要用Integer、String、Long类型 Integer和Long会有自动拆箱和装箱的过程,改变值后,可能不会是原来的对象,同步块就会失效 String因为有常量池的存在,值一致时,指向的地址会一致,会出现两个线程要锁的是同一个对象 JDK早期,synchroni原创 2021-11-23 00:25:24 · 717 阅读 · 0 评论 -
线程打断 优雅的结束一个线程
线程打断 interrupt() 打断某个线程(设置标志位) isInterrupted() 查询某个线程是否被打断过(查询标志位) static interrupted() 查询当前线程是否被打断过,并重置打断标志 线程结束 stop() 结束线程 stop结束的时候,会强行释放全部的锁,很容易导致数据不同步的问题,所以已经弃用 t.suspend() t.resume() 暂停结束线程 暂停时,锁不会被释放,会产生死锁问题,已经被废弃 volatile 关键字 volat原创 2021-11-22 22:10:04 · 285 阅读 · 0 评论 -
线程状态和线程的常用方法
线程状态 线程状态 描述 NEW 线程刚刚创建,还没有启动 RUNNABLE(READY 就绪,RUNNING 运行中) 可运行状态,由线程调度器可以安排执行 WAITING 等待被唤醒 TIMED WAITING 隔一段时间后自动唤醒 BLOCKED 被阻塞,正在等待锁资源 TERMINATED 线程结束 注:在加锁时,只有使用synchronized才会进入BLOCKED状态,使用Lock只会进入WAITING或者TIMED WAITING状态 常用方法 t.原创 2021-11-22 21:57:37 · 195 阅读 · 0 评论 -
线程创建的五种方式
方式1: 继承Thread,重写run方法,直接new对象.start启动 public class T1 { static class MyThread extends Thread{ @Override public void run() { System.out.println("MyThread..."); } } public static void main(String[] args) {原创 2021-11-22 21:43:56 · 347 阅读 · 0 评论