202207-11 Java并发之synchronized实现原理深入理解 目录synchronized的三种应用方式synchronized作用于实例方法synchronized作用于静态方法synchronized同步代码块synchronized底层语义原理理解Java对象头与Monitorsynchronized代码块底层原理synchronized方法底层原理Java虚拟机对synchronized的优化偏向锁轻量级锁自旋锁锁消除关于synchronized可能需要了解的关键点synchronized的可重入性线程中断与synchronized线程中断中断与synchronized等待唤醒机制与synchronized总结synchr... 继续阅读 >
202110-29 Java并发编程面试之线程池 目录什么是线程池线程池好处线程池的执行流程怎么用线程池corePoolSizemaximumPoolSizekeepAliveTimeunitworkQueuethreadFactoryejectedExecutionHandler线程池参数如何设置?监控线程池总结什么是线程池是一种基于池化思想管理线程的工具。池化技术:池化技术简单点来说,就是提前保存大量的资源,以备不时之需。比如我们的对象池,数据库连接池等。线程池好处我们为什么要使用线程池,直接newthreadstart不好吗?「降低资... 继续阅读 >
202109-30 Java并发编程必备之Future机制 前言Java5在concurrency包中引入了java.util.concurrent.Callable接口,它和Runnable接口很相似,但它可以返回一个对象或者抛出一个异常。Callable接口使用泛型去定义它的返回类型。Executors类提供了一些有用的方法在线程池中执行Callable内的任务。由于Callable任务是并行的,我们必须等待它返回的结果。而线程是属于异步计算模型,所以不可能直接从别的线程中得到函数返回值。java.util.concurrent.Future对象为我们解决了这... 继续阅读 >
202109-24 Java源码解析之详解ReentrantLock ReentrantLockReentrantLock是一种可重入的互斥锁,它的行为和作用与关键字synchronized有些类似,在并发场景下可以让多个线程按照一定的顺序访问同一资源。相比synchronized,ReentrantLock多了可扩展的能力,比如我们可以创建一个名为MyReentrantLock的类继承ReentrantLock,并重写部分方法使其更加高效。当一个线程调用ReentrantLock.lock()方法时,如果ReentrantLock没有被其他线程持有,且不存在额外的线程与当前线程竞争Reen... 继续阅读 >
202109-17 Java并发编程之详解CyclicBarrier线程同步 CyclicBarrier线程同步java.util.concurrent.CyclicBarrier提供了一种多线程彼此等待的同步机制,可以把它理解成一个障碍,所有先到达这个障碍的线程都将将处于等待状态,直到所有线程都到达这个障碍处,所有线程才能继续执行。举个例子:CyclicBarrier的同步方式有点像朋友们约好了去旅游,在景点入口处集合,这个景点入口就是一个Barrier障碍,等待大家都到了才一起进入景点游览参观。进入景点后大家去爬山,有的人爬得快,有的... 继续阅读 >
202109-16 java并发编程之深入理解Synchronized的使用 1.为什么要使用synchronized在并发编程中存在线程安全问题,主要原因有:1.存在共享数据2.多线程共同操作共享数据。关键字synchronized可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,同时synchronized可以保证一个线程的变化可见(可见性),即可以代替volatile。2.实现原理synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性3.synchro... 继续阅读 >
202102-21 java并发学习-CountDownLatch实现原理全面讲解 CountDownLatch在多线程并发编程中充当一个计时器的功能,并且维护一个count的变量,并且其操作都是原子操作。如下图,内部有下staticfinal的Sync类继承自AQS.该类主要通过countDown()和await()两个方法实现功能的,首先通过建立CountDownLatch对象,并且传入参数即为count初始值。如果一个线程调用了await()方法,那么这个线程便进入阻塞状态,并进入阻塞队列。如果一个线程调用了countDown()方法,则会使count-1;当count的值为... 继续阅读 >
202010-01 Java并发统计变量值偏差原因及解决方案 1问题描述在一个项目中,需要对发送的请求结果进行统计,开发同事定义了两个全局共享变量CommonUtil.ReqFailNum和ReqNum,分别记录请求失败数和发送的请求数。并在每次发送请求之前都假定该请求会处理失败,先对其累加,直到成功收到200的返回码后,重新修正失败数量。最后当应用处理请求处于较频繁的阶段时,出现了ReqFailNum最后减为负数的情况,一次正常请求完成时,CommonUtil.ReqFailNum++;和CommonUtil.ReqFailNum--应该是... 继续阅读 >