java 高并发
文章平均质量分 70
伟娃娃
java软件开发
展开
-
ForkJoin原理分析
private ForkJoinPool(int parallelism, ForkJoinWorkerThreadFactory factory, UncaughtExceptionHandler handler, int mode, String workerNamePrefix) fo...原创 2020-11-11 21:27:16 · 242 阅读 · 0 评论 -
ScheduledThreadPool源码解析
下面之一个ScheduledThreadPool,应用实例,从scheduleWithFixedDelay进入,ScheduledThreadPoolExecutor schedulePool = new ScheduledThreadPoolExecutor(2); schedulePool.scheduleWithFixedDelay(() -> { System.out.println("FixedDelay -- print every 1 sec ,"+ Ca原创 2020-11-11 21:22:31 · 155 阅读 · 0 评论 -
ScheduledThreadPool - java多线程100例-9
ScheduledThreadPoolExecutor 有2个方法:scheduleAtFixedRate 每隔period或程序执行时长执行一次。scheduleWithFixedDelay等程序执行完成后在等period时间执行一次,也就是每 程序时间+period执行一次。import java.util.Calendar;import java.util.concurrent.ScheduledThreadPoolExecutor;import java.util.concur.原创 2020-11-11 20:39:49 · 132 阅读 · 0 评论 -
CyclicBarrier-java多线程100例-8
CyclicBarrier的作用和countDownLunch倒过来用的作用很相似,区别就是可以循环使用。儿countDownLunch只能使用一次。简单的说使用就=2步,第一步 新建参赛者,定义个数CyclicBarrier cb = new CyclicBarrier(5);第二步 调用,await(),直到await被调用5次后,await后面的方法可以被执行:常用的方法介绍:new 一个CyclicBarrier并制定,参赛者是几个new CyclicBarrier(5)获取参赛者总原创 2020-10-23 20:23:33 · 83 阅读 · 0 评论 -
Semaphore - java多线程100例-7
Semaphore 的作用是限流,例如食堂只有5个窗口,放学后好多同学都来排队打饭,这个时候就可以用到这个信号量工具。例如,自定义池子里面有里面有5个许可证,每个人想要打饭的人都来竞争池子里面的许可证,只有拿到的人才可以取打饭。acquire() 获取1个许可acquire(2) 获取2个许可如果许可没有了或不够了就一直阻塞等待其他线程release,直到拿到许可为止。 @Test public void testAcquire() throws InterruptedE..原创 2020-10-22 19:02:23 · 76 阅读 · 0 评论 -
ArrayBlockingQueue工作原理及源码分析
put方法想put方法: public void put(E e) throws InterruptedException { checkNotNull(e); final ReentrantLock lock = this.lock; lock.lockInterruptibly(); try { while (count == items.length) notFull原创 2020-10-19 22:54:19 · 167 阅读 · 0 评论 -
BlockingQueue-java多线程100例-6
BlockingQueueBlockingQueue的作用和消息中间件一样,他可以削峰,限流,解耦BlockingQueue最贴合的应用场景就是生产者消费者模式。BlockingQueue是一个线程通讯的工具。BlockingQueue的线程安全的,在任意时刻,无论并发有多高,在jvm上同意时间只有一个线程能够对队列进行入队或出队操作。blockingQueue被应用到的地方有:线程池,eruca,nacos,netty。常用的BlockingQueue咋AQS 中的继承关系图.原创 2020-10-18 20:33:10 · 221 阅读 · 1 评论 -
interrupt-java多线程100例-5
在java中一个线程开始执行后,如果想停止它在早起的时候我们可以使用stop方法。但是这个方法台暴力了,如果线程在处理一些很重要的工作可能只执行到一半,就被停止了。然程序执行结果很难控。后来引入了interrupt方法。当调用interrupt()方法后并不是把执行中的线程马上中断而是给线程一个标记。我们自己new出来的线程中可以自己加逻辑判断,是否是有其他线程想中断自己,如果是可以做出自己的选择是否中断。相关的方法有三个:interrupt() -- 向某个线程发出中断信号,并将该线程原创 2020-10-15 22:17:33 · 95 阅读 · 0 评论 -
ReentrantLock的源码分析和核心思想介绍
ReentrantLock是一种基于AQS框架的应用实现。AQS 是核心思想第一自旋while(true)第二加锁,保证只有一个线程可以拿到锁,其他线程一直在自旋的循环中等待CAS 加锁 compare and swap第三用队列实现公平或非公平锁第四 LockSupport park、unpark实现阻塞。伪代码://加锁//第一 自旋while(true){ //第二 CAS 加锁 if (unsafe.compareAndSwapInt.原创 2020-10-12 21:55:08 · 130 阅读 · 0 评论 -
白话讲懂wait notify 和park unpark的使用示例和区别
wait 和notifywait 和notify使用的时候有很多的限制:例如必须用在schronized的同步块里面,因为他们依赖于schronized里面的锁。wait和notify不能指定唤醒哪一个线程,只能随机的返回一个线程。当使用调用wait时,虽然当前的线程还在schronized同步块中, 但是也会让出锁,要不然,notify永远拿不到锁,永远得不到执行。同样当使用完notify后,是不会立即释放锁的,必须使你当前线程走完schronized的代码,也就是说只有当前线程走完s原创 2020-09-27 22:09:38 · 2261 阅读 · 0 评论 -
java锁的粗化/和锁的消除以及逃逸分析
锁的粗化:简单的说就是本来需要多个锁才能解决的,jvm优化后只用一个锁就解决了。对于你写的复杂代码,jvm直接给你渔鸥花了,优化前: Object o = new Object(); synchronized (o) { System.out.println(1); } synchronized (o) { System.out.println(2); }原创 2020-09-26 11:10:01 · 329 阅读 · 0 评论 -
java锁的膨胀升级过程实例详细解
synchronized 关键字的作用:确保线程间互斥地访问同步块,即同一时间只有一个线程能进入同步块解决了可见性的问题 所以不存在指令重排的问题 解决了原则性问题多个线程有可能同时去访问同一个变量,我们称之为临界资源。隐式锁(内置锁) - synchronized的使用方法:1.synchronized 加在方法上面,锁是加在当前类的对象上面,this。2.synchronized 加在静态方法上面,锁加在当前方法所在类的上面Test.class.3.synchron原创 2020-09-21 22:30:23 · 1056 阅读 · 1 评论 -
讲清楚java并发的三大特性
可见性 – 不同线程在不同的c核中运行时工作空间的变量不共享,所以一个线程修改自己的变量后另外的线程不知道。原子性 – 一个java指令编译成汇编语言可能变成了多步,不能保证这多步不被打断。有序性 – 指令重排序,为了cpu执行的效率更高。有序性指令重排例子:1.两个线程分别执行下面连个代码块。最后的结果可能是x=0,y=0.2.单例的懒汉模式中,必须用volatile修饰instance,就是为了防止指令重排。volatile实现有序性原理:内存屏障实现有序性,汇编原创 2020-09-20 13:04:26 · 312 阅读 · 0 评论 -
为什么需要MESI缓存一致性协议
运行在不同cup的2个线程,如何保证在修改相同变量的时候不发生冲突呢 ?早期的做法加总线锁:总线锁 – > 早期多核cup实现一致性的方式,给总线加互斥锁,使另一个核pending住。这样通讯效率很低。现在的做法使用缓存一致性协议MESI Modified, Exclusive, Shared, Invalid如下图:T0 通过总线向主内存获取一个缓存行, 该缓存行包含变量counter=0,并加载到Core0的缓存中,这个时候会通过总线对该缓存行修改状态为E。如果T1也需要.原创 2020-09-20 13:19:50 · 501 阅读 · 0 评论 -
ReentrantLock-java多线程100例-4
ReentrantLock 的作用与Syncrenized相似,就是限制多个线程同时对临界资源进行访问。即对于在ReentrantLock 的lock和unlock之间的代码只有拿到锁的对象才能进行对其访问。这个锁为排他锁,只有一个线程可以拿到。例子如下:对于共享变量j,线程让他自己++ 1000000次。class ReentrantLockCase1 implements Run...原创 2020-03-03 21:17:49 · 123 阅读 · 0 评论 -
Join-java多线程100例-3
join方法的注解如下, 我的理解是,主线程不往下执行了直到调用join方法的子线程执行完毕或终止为止。注意,调用join方法只能控制子线程于主线程直接的执行顺序,并不能控制子线程之间的执行顺序,join里面的wait方法是主线程的,只会让主线程wait住。/** * Waits for this thread to die. */定义一个类,继承Runnable 接口,该类可以根据传...原创 2020-02-29 20:10:33 · 121 阅读 · 0 评论 -
java 高并发(多线程)100例 - 2 - CountDownLatch 的使用
模拟了100米赛跑,10名选手已经准备就绪,只等裁判一声令下。当所有人都到达终点时,比赛结束。定义一个选手类,继承Callable接口。class Player implements Callable { public Object call() throws Exception { System.out.println(Thread.currentThrea...原创 2020-02-26 22:32:59 · 707 阅读 · 0 评论 -
java 高并发(多线程)100例 - 1 - 开启线程三种方式
第一例, 启动线程的三种方式1. 继承Thread 类。class TestThread extends Thread { @Override public void run(){ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); System.out.pr...原创 2020-02-26 20:33:37 · 1461 阅读 · 0 评论 -
白话讲懂java线程池的使用和源码
线程池是一个稀缺资源,如果被无限的创建,会消耗系统资源,产生竞争死锁,降低系统效率。对于每个线程执行时间很少的这种场景就很适合让线程重用。否则可能出现花在系统创建销毁线程上的时间比线程真正执行的事件还长,消耗的资源还多的情况。应用场景:单个任务处理时间比较短 需要处理的任务数量比较大线程池的优势:重用线程,减少线程创建销毁的系统消耗,提高性能。 提高响应速度(不用创建销毁) 提...原创 2019-12-11 21:44:39 · 133 阅读 · 1 评论 -
java中的锁最详细分类
悲观锁,乐观锁:悲观锁:window 共享文件夹中的文件加锁,一开始就独占。乐观锁:svn/git中的版本控制,提交的时候才校验。在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是著名的并发性问题。典型的冲突有:丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失。例如:用户A把值从6改为2,用户B把值从2改为6,则用户A丢...原创 2019-07-27 11:42:57 · 128 阅读 · 0 评论