java多线程
文章平均质量分 73
深山猿
不断进化的深山猿
展开
-
parallelStream与CompletableFuture
1 了解parallelStreamparallelStream怎么实现的并行处理呢?其底层是Fork/Join并行计算框架的默认线程池,默认线程池的数量就是处理器的数量,可以使用系统属性:-Djava.util.concurrent.ForkJoinPool.common.parallelism={N} 调整。1.1 并发问题 HashMap<String, String> map = new HashMap<>(); for原创 2023-06-20 19:47:00 · 796 阅读 · 0 评论 -
lamada表达式、stream、collect整理
lamada表达式、stream、parallelStream、collect整理原创 2023-02-10 16:22:20 · 624 阅读 · 0 评论 -
rpc接口并发调用实例与方法内部声明线程池导致的oom
问题背景需要根据id通过rpc调用查询具体信息,因为没有提供批量查询的接口,所以做法是挨个遍历查询,那意味着:如果有100个id,就需要顺序进行100次rpc调用,假设每次rpc接口的调用时间是50ms(这个速度很快了),那单单rpc调用就要占用5s,所以接口的响应会非常慢。下面进行优化。优化方案:方案一:让服务方提供批量查询接口,需要服务提供方配合,这里暂不采用。方案二:rpc服务的调用由顺序调用修改为并行调用,采用线程池实现rpc的并发调用。具体实现如下:1)创建线程的类public原创 2020-10-21 09:32:11 · 3222 阅读 · 0 评论 -
wait notify notifyAll
wait该方法用来将当前线程释放锁,并且进入wait pool,此时没有资格争抢锁。notify():唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个在等待),注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。调用任意对象的notify()方法则导致因调用该对象的 wait()方法而阻塞的线程中随机选择的一个解除阻塞(...原创 2020-03-14 16:27:51 · 140 阅读 · 0 评论 -
spring单例与线程安全,并行调用服务加速响应
问题:ssm框架,spring中controller和service都是单例的,那是怎么保证线程安全呢?通过threadLocal保证,实际一个实例,tomcat中线程池执行任务时,获取单例的副本,每个线程的执行都是操作单例的副本那既然有单例的副本,此时还是单例的吗?????https://www.cnblogs.com/-zhuang/articles/10607877.html所...原创 2019-11-20 21:43:09 · 341 阅读 · 0 评论 -
线程安全 重排序 JMM和happenns-before
线程安全的概念:当存在多线程操作相同的对象时,在java语义之下,无论系统怎么调度和交替执行,最终获取的结果都是相同且正确的,那么就是线程安全。导致线程不安全的两个原因:主内存和线程工作内存数据不一致导致的(JMM结构)代码的重排序导致的JMM(java memory model)抽象结构模型CPU的处理速度和主存的读写速度不是一个量级的,为了平衡这种巨大的差距,每个CPU都会有...原创 2019-10-25 18:10:42 · 259 阅读 · 1 评论 -
java多线程中的异常处理
首先,我们要知道,在Java中,线程中的异常是不能抛出到调用该线程的外部方法中捕获的。为什么不能抛出到外部线程捕获?因为线程是独立执行的代码片断,线程的问题应该由线程自己来解决,而不要委托到外部。”基于这样的设计理念,在Java中,线程方法的异常都应该在线程代码边界之内(run方法内)进行try catch并处理掉。换句话说,我们不能捕获从线程中逃逸的异常。怎么进行的限制?通过java...转载 2019-10-18 21:38:57 · 2589 阅读 · 1 评论 -
java juc包概述
1 atomic包核心是CAS,主要提供了一系列原子变量更新操作的类,提供非阻塞式算法基础。AtomicLong的原理 value(valatile)+valueOffset+Unsafestatic { try { valueOffset = unsafe.objectFieldOffset (AtomicLong.class....原创 2019-10-15 22:38:39 · 3745 阅读 · 1 评论 -
countDownLatch(CAS+UNSAFE.park)和cyclicBarrier(ReentrantLock+count自减+condiiton.await)
countDownLatch(AQS)和cyclicBarrier(ReentrantLock)countDownLatchAQS(state+queue )初始化时,state被初始化调用await,判断state的值,如果state=0,则不会阻塞线程;否则在哪个线程执行执行就会阻塞(UNSAFE.park)哪个线程。然后countDown被调用,每调用一次,state会被减...原创 2019-10-15 22:26:49 · 310 阅读 · 0 评论 -
java进程线程数获取与限制因素
public static void main(String[] args) { System.out.println("hello!"); ThreadGroup group = Thread.currentThread().getThreadGroup(); // 获取顶层 线程组 ThreadGroup top = group; while(gro...原创 2019-10-11 22:21:47 · 925 阅读 · 0 评论 -
java CAS中的ABA问题
a->b->a原本想执行 第一个a->c ,实际执行的是 第二个a->c 此时是没有问题的,因为ac就是一个完整的原子操作实例:例如目前要将某银行账号的余额扣除 50, 通过 CAS 保证同步 :首先读取原有余额为 100 ,计算余额应该赋值为 100 - 50 = 50此时该线程被挂起, 该账户同时又发生了转入 150 和转出 150 的操作, 余额经历了 1...原创 2019-10-11 22:05:03 · 230 阅读 · 1 评论 -
synchronized,ReentrantLock、ReentrantReadWriteLock和StampedLock
java四种上锁方式原理及适用场景区分synchronized(monitor)、ReentantLock(AQS)、AtomicLong(CAS)、LongAdder(XADD)针对代码块需要同步的锁synchronized---锁竞争不激烈的场景竞争不激烈的时候,各种锁优化机制会发挥作用(如轻量级锁、偏向锁、自旋锁、锁消除等),如果竞争激烈,会使用重量级锁,性能下降。Reentan...原创 2019-01-23 18:11:31 · 871 阅读 · 0 评论 -
ThreadLocal使用注意:线程不安全,可能会发生内存泄漏
先说可能会发生内存泄漏:前言ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。但是如果滥用ThreadLocal,就可能会导致内存泄漏。下面,我们将围绕三个方面来分析ThreadLocal 内存泄漏的问题ThreadLocal 实现原理 ThreadLocal为什么会内存泄漏 Th...原创 2018-10-12 21:50:37 · 14685 阅读 · 3 评论 -
线程创建的8种方式,Callable runnable submit和execute方法 futureTask
java中创建多线程是基于下面四种组件:Callable runnable ExecutorService的submit和execute方法 futureTask,这里简单介绍这些组件和创建线程的8种方式ExecutorService的execute和submit方法区别与联系submit---带返回值<T> Future<T> submit(Callab...原创 2018-10-11 20:14:28 · 10134 阅读 · 0 评论 -
ThreadLocal使用的情景和原理
线程本地存储,ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。这是防止多线程在资源上产生冲突的第二种方式,即每个线程都有一个完整的副本,该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadL...原创 2018-08-07 10:47:29 · 8614 阅读 · 0 评论 -
用lock condition实例,与await区别,await为何必须用在lock()里面
消费者生产者应该包括以下部分:1被消费和生产的对象(car)2生产者(Producer)3消费者(Consumer)4客户端调用被操作类publicclassCar {privatebooleanwaxStatus= false;//车的上蜡状态privateLock lock= newReentrantLock();Cond...原创 2018-07-27 22:25:04 · 11133 阅读 · 0 评论 -
可重入锁和不可重入锁
可重入锁和不可重入锁概念区分当一个线程获得当前实例的锁lock,并且进入了方法A,该线程在方法A没有释放该锁的时候,是否可以再次进入使用该锁的方法B?不可重入锁:在方法A释放锁之前,不可以再次进入方法B可重入锁:在方法A释放该锁之前可以再次进入方法B;如ReentrantLock和synchronized原理分析不可重入锁的实现:publicclassLock {...原创 2018-07-27 22:16:09 · 11973 阅读 · 2 评论 -
concurrentHashMap原理和hashTable-线程安全的hashmap的三种实现
concurrentHashMap hashTable源码分析与比较线程安全的Map共经历了三个过程,直接在方法上增加synchronized方法,segment段实现减少锁的粒度,cas(当前内存中的值V和旧的预期值A是否相等,如果相等则将新的值B赋值给V)锁实现。https://blog.csdn.net/dianzijinglin/article/details/80997935h...原创 2018-07-31 15:47:01 · 9901 阅读 · 0 评论 -
线程等待的四种方式-join/future/countDownLatch/cylicBarrier实现
场景如下:一共三个线程a,b,c,其中c需要用到a,b,执行的结果,应该怎么处理? 1)CountDownLatch,主线程中调用await方法,每个线程调用countdown上面两种方法需要分别调用多次join或future的get方法,不太好,有一种方法是使用CountDownLatch类认知CountDownLatch的方法:await():阻塞主线程,直到countDow...原创 2019-01-23 18:33:23 · 2065 阅读 · 1 评论 -
线程中断的3+2(自定义执行状态和处理不可中断的阻塞)种方式、setDaemon(守护线程)、Future的方法
Java分为两种线程:用户线程和守护线程守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。守护线程和用户线程的没啥本质的区别:唯一的不同之处就在于虚拟机的离开:如果用户线...原创 2019-01-23 19:35:34 · 811 阅读 · 0 评论 -
byte\char\string\stringBuilder和stringBuffer
byte和char的区别于联系byte 1字节,有符号,一般表示数字,-127--128char 2字节,无符号(0-65535),java中一般用来表示一个字符如 a,’中‘;也可以用来表示数字;java中 unicode编码 1char=2byte=16bithttps://blog.csdn.net/luoweifu/article/details/7770588 char和byt...原创 2019-06-24 18:19:50 · 297 阅读 · 0 评论 -
剖析基于并发AQS的共享锁的实现(基于信号量Semaphore)
原 剖析基于并发AQS的共享锁的实现(基于信号量Semaphore) 2017年07月31日 09:33:37 zejian_ 阅读数:17063 </div> <div class="oper...转载 2019-01-23 17:01:56 · 135 阅读 · 0 评论 -
深入剖析java并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue
原 深入剖析java并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue 2017年08月31日 13:40:13 zejian_ 阅读数:48047 &lt;/div&gt; ...转载 2019-01-23 17:20:48 · 201 阅读 · 1 评论 -
深入剖析基于并发AQS的(独占锁)重入锁(ReetrantLock)及其Condition实现原理
版权声明:本文为博主原创文章,请尊重原创,未经博主允许禁止转载,保留追究权 https://blog.csdn.net/javazejian/article/details/75043422 &lt;/div&gt; &lt;div id...转载 2019-01-23 16:57:02 · 196 阅读 · 0 评论 -
Java并发编程-无锁CAS与Unsafe类及其并发包Atomic,原子更新类
原 Java并发编程-无锁CAS与Unsafe类及其并发包Atomic 2017年07月05日 11:11:36 zejian_ 阅读数:18841 &amp;lt;/div&amp;gt; &amp;lt;div class=&quot;ope...转载 2019-01-23 16:53:19 · 313 阅读 · 0 评论 -
深入理解Java并发之synchronized实现原理
原。原创 2019-01-23 16:53:37 · 310 阅读 · 3 评论 -
从AtomicLong到LongAdder,LongAdder的原理
java.util.concurrency.atomic.LongAdder是Java8新增的一个类,提供了原子累计值的方法。根据文档的描述其性能要优于AtomicLong,下图是一个简单的测试对比(平台:MBP):这里测试时基于JDK1.8进行的,AtomicLong 是原子类,JUC下面提供的原子类都是基于Unsafe类实现的,并由Unsafe来提供CAS的能力。CAS (compare-...原创 2019-01-31 18:31:17 · 3824 阅读 · 1 评论 -
多线程死锁实例与定位
既然可以上锁,那么假如有2个线程,一个线程想先锁对象1,再锁对象2,恰好另外有一个线程先锁对象2,再锁对象1。在这个过程中,当线程1把对象1锁好以后,就想去锁对象2,但是不巧,线程2已经把对象2锁上了,也正在尝试去锁对象1。什么时候结束呢,只有线程1把2个对象都锁上并把方法执行完,并且线程2把2个对象也都锁上并且把方法执行完毕,那么就结束了,但是,谁都不肯放掉已经锁上的对象,所以就没有结果,这种情...原创 2019-01-15 19:45:52 · 253 阅读 · 0 评论 -
线程/进程,多线程作用 线程的状态 run和start
理解线程、进程和锁为什么需要线程?1充分使用cpu来提高效率,包括两个方面:单个cpu的充分利用,在一个线程处理中,cpu并不是一直处于忙碌状态,典型场景是需要进行磁盘IO,而磁盘的IO与cpu处理相比,速度相差很大,此时cpu就会长久处于空闲状态,所以如果还有别的线程,cpu就可以在空闲时间处理别的线程。注意:单个时间只会有一个线程被处理 针对服务器有多个cpu的场景,单线程只会使...原创 2019-01-15 10:48:42 · 297 阅读 · 0 评论 -
java多线程之synchronized 和 volatile - (effective java item66中的一处错误)
我们都知道线程有个stop怎么停止?先给出一个错误的方式1public class ThreadStop { //失败的方法1 这种在一秒后stopThread虽然被修改了,但是backThread并没有获取到该信息 public static boolean stopThread; public static void ma...原创 2018-07-14 19:00:11 · 8335 阅读 · 1 评论