
java并发编程
文章平均质量分 61
努力的布布
花有重开日,人无再少年。
展开
-
JAVA多线程-(十五)CountDownLatch
CountDownLatchCountDown叫倒数,Latch是门栓的意思(倒数的一个门栓,5、4、3、2、1数到了,我这个门栓就开了)。CountDownLatch latch = new CountDownLatch(threads.length);//倒数的数字latch.countDown();//这个方法调用一次, new CountDownLatch(threads.length)数字就减一latch.await();阻塞主线程,当latch.countDown();调用次数和new原创 2022-04-30 21:21:49 · 502 阅读 · 0 评论 -
JAVA多线程-(二十一)JMH使用
JMH简介JMH(Java Microbenchmark Harness)是用于代码微基准测试的工具套件,主要是基于方法层面的基准测试,精度可以达到纳秒级。该工具是由 Oracle 内部实现 JIT 的大牛们编写的,他们应该比任何人都了解 JIT 以及 JVM 对于基准测试的影响。JMH不止能对Java语言做基准测试,还能对运行在JVM上的其他语言做基准测试。应用场景想准确地知道某个方法需要执行多长时间,以及执行时间和输入之间的相关性对比接口不同实现在给定条件下的吞吐量查看多少百分比的请求在多长原创 2022-04-30 13:51:30 · 670 阅读 · 0 评论 -
JAVA多线程-(十四)wait/notify使用
wait/notify使用wait会释放锁,而notify不会释放锁。wait()和notify()是object类的方法,这两个方法必须在synchronized代码块或synchronized修饰的方法中使用,调用这两个方法的代码块必须要获得synchronized。实现一个容器,提供两个方法,add,size写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束。import java.util.ArrayList;import jav原创 2022-04-26 00:16:30 · 473 阅读 · 0 评论 -
JAVA多线程-(十七)Semaphore信号量
Semaphore信号量,最多允许多少个线程运行。可做限流 每次允许多少个线程import java.util.concurrent.Semaphore;public class T11_TestSemaphore { public static void main(String[] args) { //Semaphore s = new Semaphore(2); Semaphore s = new Semaphore(2, true);//permits原创 2022-08-31 08:51:33 · 193 阅读 · 0 评论 -
线程和纤程
纤程:线程内部的执行路径是纤程操作系统线程之间的切换,CPU是根据线程栈来做的,CPU在各个线程之间来回切换是根据线程栈实现;纤程也是这样,本质是站纤程栈之间的切换,两者区别是是否通过内核空间。Linux操作系统分为用户级和系统级,JVM跑在用户空间。进行系统调用要在内核空间,包括线程调用要在内核空间。纤程之间切换在用户空间,线程切换在内核空间,文件读写不涉及线程中断不适合纤程,做内存计算适合纤程。操作系统支持的线程比较少,但是支持的纤程比较多,因为线程切换消耗资源。纤程使用 <原创 2022-04-17 21:47:21 · 957 阅读 · 0 评论 -
JAVA多线程-(十三)Exchanger
Exchanger定义了一个Exchanger,Exchanger叫做交换器,俩人之间互相交换个数据用的。怎么交换呢,看这里,我第一个线程有一个成员变量叫s,然后exchanger.exchange(s),第二个也是这样,t1线程名字叫T1,第二个线程名字叫T2。到最后,打印出来你会发现他们俩交换了一下。线程间通信的方式非常多,这只是其中一种,就是线程之间交换数据用的。exchanger你可以把它想象成一个容器,这个容器有两个值,两个线程,有两个格的位置,第一个线程执行到exchanger.exchan原创 2022-04-30 21:19:30 · 839 阅读 · 0 评论 -
JAVA多线程-(十二)读写锁
ReentrantReadWriteLock读锁是共享锁,允许多个线程共同读;写锁是排他锁,只允许一个线程写;package com.juc.c_020;import java.util.Random;import java.util.concurrent.atomic.LongAdder;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReadWriteLock;import java.ut原创 2022-04-30 21:18:39 · 109 阅读 · 0 评论 -
JAVA多线程-(十一)phaser
PhaserPhaser它就更像是结合了CountDownLatch和CyclicBarrier,翻译一下叫阶段。Phaser是按照不同的阶段来对线程进行执行,就是它本身是维护着一个阶段这样的一个成员变量,当前我是执行到那个阶段,是第0个,还是第1个阶段啊等等,每个阶段不同的时候这个线程都可以往前走,有的线程走到某个阶段就停了,有的线程一直会走到结束。程序中如果说用到分好几个阶段执行 ,而且有的人必须得几个人共同参与的一种情形的情况下可能会用到这Phaser。package com.juc.c_020原创 2022-04-30 21:16:22 · 942 阅读 · 0 评论 -
JAVA多线程-(十)并发编程-CAS
CAScas号称是无锁优化,或者叫自旋。java提供了AtomXXX类这些个类,这些类的内部就自动带了锁,当然这些锁的实现并不是synchronized重量级锁,而是CAS的操作来实现的(号称无锁)。ABA问题想把一变成二,但是操作的时候有别的线程把1编程2又变成了1,解决ABA问题可以通过版本号。基础数据类型没有问题无影响;但是引用类型对象会有影响;10个线程每个线程执行1000次加1操作-AtomicInteger实现/** * 解决同样的问题的更高效的方法,使用AtomXXX类 *原创 2022-04-30 21:15:12 · 198 阅读 · 0 评论 -
JAVA多线程-(九)CyclicBarrier
CyclicBarrierCyclicBarrier要做的事情是让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程一起执行。CyclicBarrier(int parties):构造方法,parties表示拦截线程的数量。CyclicBarrier(int parties, Runnable barrierAction):barrierAction用于在线程到达屏障时优先执行b,用于处理更加复杂的业务场景。await():将当前线程阻塞,等到所有的原创 2022-04-30 21:13:52 · 221 阅读 · 0 评论 -
JAVA多线程-(八)ReentrantLock可重入锁和公平锁
synchronized可重入锁synchronized本身就是可重入锁的一种,什么叫可重入,意思就是我锁了一下还可以对同样这把锁再锁一下,synchronized必须是可重入的,不然的话子类调用父类是没法实现的。获取一把锁,可以访问这把锁锁定的所有方法。synchronized是自动解锁的,大括号执行完就结束了,或者遇到异常也会结束锁。/** * * 本例中由于m1锁定this,只有m1执行完毕的时候,m2才能执行 * 这里是复习synchronized最原始的语义 */package原创 2022-04-30 21:11:29 · 428 阅读 · 0 评论 -
JAVA多线程-(七)synchronized关键字详解
用户态与内核态JDK早期,synchronized 叫做重量级锁, 因为申请锁资源必须通过kernel, 系统调用。操作系统内核可以访问所有指令,用户态必须通过操作系统调用内核可以访问的命令是内核态可以直接访问的。对象内存布局之markword普通对象1:第一是对象头,在hotport里面称为markword 长度是8个字节2:第二个是ClassPointer指针:-XX:+UseCompressedClassPointers 为4字节 不开启为8字节。通过这个能找到xx.class这个类。3原创 2022-04-30 21:08:40 · 573 阅读 · 0 评论 -
JAVA多线程-(十九)Disruptor单机最快的MQ
Disruptor对比ConcurrentLinkedQueue : 链表实现JDK中没有ConcurrentArrayQueueDisruptor是数组实现的无锁,高并发,使用环形Buffer,直接覆盖(不用清除)旧的数据,降低GC频率实现了基于事件的生产者消费者模式(观察者模式)RingBuffer环形队列RingBuffer的序号,指向下一个可用的元素采用数组实现,没有首尾指针对比ConcurrentLinkedQueue,用数组实现的速度更快假如长度为8,当添加到第1原创 2022-04-30 10:48:26 · 1949 阅读 · 0 评论 -
JAVA多线程-(十八)ThreadLocal线程局部变量和强软弱虚四种引用
ThreadLocal线程局部变量ThreadLocal是使用空间换时间,synchronized是使用时间换空间,比如在hibernate中session就存在与ThreadLocal中,避免synchronized的使用。import java.util.concurrent.TimeUnit;public class ThreadLocal2 { //volatile static Person p = new Person(); static ThreadLocal<Person&g原创 2022-04-26 22:27:06 · 742 阅读 · 0 评论 -
JAVA多线程-(六)并发编程三大特性之原子性
并发编程三大特性原子性线程的原子性证明线程的原子性package com.juc.c_001_sync_basics;import java.util.concurrent.CountDownLatch;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class T00_00_IPlusPlus { private static long n原创 2022-04-22 20:19:17 · 670 阅读 · 0 评论 -
JAVA多线程-(五)并发编程三大特性之有序性volatile
与原创 2022-04-21 21:25:36 · 685 阅读 · 0 评论 -
JAVA多线程-(四)并发编程三大特性之可见性volatile
并发编程三大特性可见性volatile 修饰变量/** * volatile 关键字,使一个变量在多个线程间可见 * A B线程都用到一个变量,java默认是A线程中保留一份copy,这样如果B线程修改了该变量,则A线程未必知道 * 使用volatile关键字,会让所有线程都会读到变量的修改值 * <p> * 在下面的代码中,running是存在于堆内存的t对象中 * 当线程t1开始运行的时候,会把running值从内存中读到t1线程的工作区,在运行过程中直接使用这个copy,原创 2022-04-19 22:55:14 · 543 阅读 · 0 评论 -
JAVA多线程-(三)如何让线程暂停
如何让线程暂停stop方法package com.juc.c_001_00_thread_end;import com.util.SleepHelper;public class T01_Stop { public static void main(String[] args) { Thread t = new Thread(() -> { while (true) { System.out.println("原创 2022-04-19 19:04:36 · 2307 阅读 · 0 评论 -
JAVA多线程-(二)线程的生命周期和线程的“打断”
线程的生命周期1.生命周期一个线程从创建,到最终的消亡,需要经历多种不同的状态,而这些不同的线程状态,由始至终也构成了线程生命周期的不同阶段。线程的生命周期可以总结为下图。其中,几个重要的状态如下所示。NEW:初始状态,线程被构建,调用new Thread(),但是还没有调用start()方法。RUNNABLE:可运行状态,可运行状态可以包括:运行中状态和就绪状态,就绪状态是调用了start()方法,但是没有获取CPU资源,等待获取CPU资源的状态,一旦获取了CPU资源线程调度器开始调度就会开始原创 2022-04-18 22:42:31 · 593 阅读 · 0 评论 -
JAVA多线程-(一)线程基本概念、启动方式和常用方法
线程的历史 – 一部对于CPU性能压榨的历史▪单进程人工切换– 纸带机▪ 多进程批处理– 多个任务批量执行▪ 多进程并行处理– 把程序写在不同的内存位置上来回切换▪ 多线程– 一个程序内部不同任务的来回切换– selector - epoll ▪ 纤程/协程– 绿色线程,用户管理的(而不是OS管理的)线程单核CPU设定多线程是否有意义?通常情况下每一个线程运行在一个CPU的内核上,但是任务分为IO密集型和计算密集型。计算需要CPU,IO不要占用CPU,如果是执行IO密集型任务的时候原创 2022-04-17 22:36:12 · 467 阅读 · 0 评论