多线程与高并发
文章平均质量分 64
NoloseWind
From zero to hero.
展开
-
Disruptor简单理解 QPS TPS 压力测试JMH使用
QPSQuery per Second每秒查询率,也就是一个接口每秒可以执行多少次TPSTransactions per Second每秒传输事务的个数,也就是服务器每秒处理的事务数JMH测试一个方法的性能官方建议打好jar包放去服务器中测试,开发环境会对测试结果有影响需要写在test包下JMH注解@Benchmark • 在方法上添加,就可以进行测试@Warmup • 预热,对于测试结果很重要,由于JVM中对于特定代码会存在优化(本地化) • 参数: Iteratio原创 2021-11-23 10:36:44 · 650 阅读 · 0 评论 -
线程池 ThreadPoolExcutor和ForkJoinPool
Excutor执行器接口,execute是执行方法,使定义和运行可以分开,运行的方式可以自己去定义ExcutorService除了执行任务之外,还完善了整个任务执行的生命周期submit方法为异步方法,返回值为Future,Future中的get可以获取线程执行的返回值,如果没有返回值,该方法会阻塞CompletableFuture各种线程任务的管理类提供了四个静态方法来创建一个异步操作,以及四个计算完结果后的回调方法线程池线程池分为两类,分别是ThreadPoolExcu原创 2021-11-23 10:12:49 · 605 阅读 · 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 · 994 阅读 · 0 评论 -
JUC同步锁 同步工具类 AQS底层
JUC同步锁1. LongAdder分段锁,分为片断来上锁也就是把不同的线程进行分组,最后再进行统计加和底层每个线程也是CAS操作2. ReentrantLocklockInterruptibly:表示抢锁的时候,可以被设标志位打断抢锁Condition:本质就是等待队列,ReentrantLock可以有多个等待队列,用于执行不同的事情公平锁与不公平锁○ 默认是非公平锁,可以传入一个boolean来决定○ 公平锁是指才来的线程需要去队列排队,不能直接抢锁,保证线程获取到资源的概原创 2021-11-23 01:10:18 · 96 阅读 · 0 评论 -
强软弱虚引用 ThreadLocal
强引用A a = new A();就是强引用可以重写finalize来测试,当没有引用指向这个对象时,就会被回收软引用一个对象,如果是软引用指向它,那只有在内存不够用的情况下,才会回收它,内存够的情况下不会回收设置jvm参数 -Xms20M -Xmx20M配合SoftReference来测试,堆内存不够了才会回收软引用主要用作缓存弱引用只要遭遇到GC垃圾回收就会被回收如果有一个强引用和一个弱引用同时指向一个对象,只要强引用消失,这个对象就会被回收可以防止内存泄漏,一般用在容器中原创 2021-11-23 01:00:37 · 138 阅读 · 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 · 392 阅读 · 0 评论 -
synchronized锁升级过程 悲观锁 乐观锁 偏向锁 MarkWord锁标识位
synchronized基础概念要完成原子性操作,只能靠锁来实现上锁的本质就是把并发操作转变为序列化操作修饰方法锁的是对象,修饰静态方法锁的是类的class,class只有一个抛出异常,锁会被释放synchronized锁对象时不要用Integer、String、Long类型Integer和Long会有自动拆箱和装箱的过程,改变值后,可能不会是原来的对象,同步块就会失效String因为有常量池的存在,值一致时,指向的地址会一致,会出现两个线程要锁的是同一个对象JDK早期,synchroni原创 2021-11-23 00:25:24 · 677 阅读 · 0 评论 -
线程打断 优雅的结束一个线程
线程打断interrupt()打断某个线程(设置标志位)isInterrupted()查询某个线程是否被打断过(查询标志位)static interrupted()查询当前线程是否被打断过,并重置打断标志线程结束stop()结束线程stop结束的时候,会强行释放全部的锁,很容易导致数据不同步的问题,所以已经弃用t.suspend() t.resume()暂停结束线程暂停时,锁不会被释放,会产生死锁问题,已经被废弃volatile关键字volat原创 2021-11-22 22:10:04 · 261 阅读 · 0 评论 -
线程状态和线程的常用方法
线程状态线程状态描述NEW线程刚刚创建,还没有启动RUNNABLE(READY 就绪,RUNNING 运行中)可运行状态,由线程调度器可以安排执行WAITING等待被唤醒TIMED WAITING隔一段时间后自动唤醒BLOCKED被阻塞,正在等待锁资源TERMINATED线程结束注:在加锁时,只有使用synchronized才会进入BLOCKED状态,使用Lock只会进入WAITING或者TIMED WAITING状态常用方法t.原创 2021-11-22 21:57:37 · 174 阅读 · 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 · 314 阅读 · 0 评论