
多线程并发
文章平均质量分 67
jaryle
这个作者很懒,什么都没留下…
展开
-
ThreadLocal 内存泄漏问题(^_^)
ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。但是如果滥用ThreadLocal,就可能会导致内存泄漏。下面,我们将围绕三个方面来分析ThreadLocal 内存泄漏的问题:ThreadLocal 实现原理ThreadLocal为什么会内存泄漏ThreadLocal 最佳实践T...原创 2020-01-15 15:56:20 · 330 阅读 · 0 评论 -
JDK 7中引入的并发框架Fork/Join(^_^)
Fork/Join 框架是 JDK 1.7 提供的并行执行任务框架,这个框架通过(递归)把问题划分为子任务,然后并行的执行这些子任务,等所有的子任务都结束的时候,再合并最终结果的这种方式来支持并行计算编程。 总体的设计参考了为 Cilk 设计的work-stealing 框架。 Fork/Join 并行方式是获取良好的并行计算性能的一种最简单同时也是最有效的设计技术,是分治算法(Divid...原创 2019-09-27 17:54:24 · 407 阅读 · 0 评论 -
JDK1.5中的Callable接口和Futrue接口
我们在创建线程的方式有二种:1.继承Thread类;2.实现Runnable接口,但是在创建线程后,我们无法获取线程执行后的结果,就必须通过共享变量或者使用线程通信的方式来达到效果,比较繁琐,所以JDK1.5就添加了Callable和Futrue接口,通过它们可以在任务执行完毕之后得到任务执行结果,他们是相伴相生的。它们都是java.util.concurrent包下一、Callable接口位...原创 2019-08-26 17:50:44 · 421 阅读 · 0 评论 -
java多线程向RabbitMQ推送消息
首先我们使用Executor框架来实现多线程。1.向IOC容器中注册一个ThreadPoolTaskExecutor实例@Bean public ThreadPoolTaskExecutor DoneThreadPool(){ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); ...原创 2019-08-08 14:23:46 · 1637 阅读 · 0 评论 -
分布式/分布式锁/分布式锁常用方案(^_^^_^^_^)
### 什么是锁?在单进程的系统中,当存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步,使其在修改这种变量时能够线性执行消除并发修改变量。 而同步的本质是通过锁来实现的。为了实现多个线程在一个时刻同一个代码块只能有一个线程可执行,那么需要在某个地方做个标记,这个标记必须每个线程都能看到,当标记不存在时可以设置该标记,其余后续线程发现已经有标记了则等待拥有标记的线...转载 2019-06-26 20:16:04 · 363 阅读 · 0 评论 -
JDK1.8 CompletableFuture异步编程(^_^)
JDK 5引入了Future模式。Future接口是Java多线程Future模式的实现,在java.util.concurrent包中,可以来进行异步计算。Future模式是多线程设计常用的一种设计模式。Future模式可以理解成:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时间之后,我就便可以从Future那儿取出结果。Fut...原创 2019-06-20 16:56:23 · 2840 阅读 · 0 评论 -
ConcurrentHashMap对于不同JDK版本的不同结构(^_^^_^)
了解ConcurrentHashMap 实现原理,建议首先了解下HashMap实现原理。为什么要用ConcurrentHashMapHashMap线程不安全,而Hashtable是线程安全,但是它使用了synchronized进行方法同步,插入、读取数据都使用了synchronized,当插入数据的时候不能进行读取(相当于把整个Hashtable都锁住了,全表锁),当多线程并发的情况下...转载 2019-06-19 13:01:46 · 346 阅读 · 0 评论 -
synchronized 什么时候释放锁
任何线程进入同步代码块、同步方法之前,必须获得同步监视器的锁定,那么何时会释放这个锁定呢?在程序中,是无法显式释放对同步监视器的锁的,而会在如下几个情况下释放锁。1、当前线程的同步方法、代码块执行结束的时候释放2、当前线程在同步方法、同步代码块中遇到break 、 return 终于该代码块或者方法的时候释放。3、。。。。出现未处理的error或者exception导致异常结束的时候释...原创 2019-04-28 09:57:01 · 6295 阅读 · 0 评论 -
java 线程安全模型
1、copy-on-write 简写cowJava中一种使用cow模型来实现的并发类是CopyOnWriterArrayList。相比于Vector,它的操作时无需加锁的。之所以有如此功效,采取空间换时间的方法,只在add方法上加锁(synchronized),get操作是无需加锁。原理:就是对当前数据先copy一份到一个新的数组,然后对新的数组进行赋值操作。这样就可以不影响get读取数据...原创 2019-01-17 14:13:21 · 260 阅读 · 0 评论 -
java并发库的同步工具
CountDownLatch 同步倒数计数器CountDownLatch是一个同步倒数计数器。CountDownLatch允许一个或多个线程等待其他线程完成操作。CountDownLatch对象内部存有一个整数作为倒数计数器。调用countDown()方法就将计数器减1,当计数到达0时,则所有等待者会停止等待。计数器的操作是原子性的。而这个“倒数”过程则是由各个执行线程驱动的,每个线...转载 2018-09-02 13:36:34 · 167 阅读 · 0 评论 -
java中线程的几种状态
线程总共有6种状态1.初始状态,也叫新建,新创建了一个线程对象,但还没有调用start()方法。2,运行状态或者就绪,Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就...原创 2018-09-02 11:16:34 · 521 阅读 · 0 评论 -
java 锁和synchronizied的区别
java 在多线程并发编程中,为了线程安全,我们需要对线程数据进行同步,一般的实现方式就是synchronized和重入锁Lock(ReetrantLock,ReadWriterLock等)共同点:都是通过加锁方式来实现同步,而且都是阻塞式同步(也就是一个线程进入同步代码块,其他线程就在外面等待)。区别:synchronized是java关键字,是原生态层面互斥,通过jvm层面实现,不...原创 2018-09-02 10:28:30 · 598 阅读 · 0 评论 -
java 多线程之future用法和意义
在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果。所以run的返回值是void类型。如果是一个多线程协作程序,比如菲波拉切数列,1,1,2,3,5,8...使用多线程来计算。但后者需要前者的结果,就需要用callable接口了。callable用法和runnable一样,只不过调用的是call方法,该方法有一个泛型返回值类型,你可以任意指定。原创 2017-11-08 14:11:43 · 1200 阅读 · 0 评论 -
java 中多线程并发ConcurrentHashMap总结
并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求(这点好像CAP理论啊 O(∩_∩)O)。ConcurrentHashMap的设计与实现非常精巧,大量的利用了volatile,f原创 2017-10-19 14:17:24 · 7605 阅读 · 0 评论 -
java中等待一些线程执行完之后,再去执行别的方法(后者需要使用前者返回的结果)
Java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个处理都可以用一个线程来执行,所有处理完成了之后才会返回给用户下单成功。我们通过以下的几种方法来解决:一、用sleep方法,让主线程睡眠一段时间,当然这个睡眠时间是主观的时间,是我们自己定的,这个方法不推荐,但是在这里还是写一下,毕竟是解决方法原创 2017-07-09 20:10:52 · 23467 阅读 · 4 评论 -
创建线程的2种方式
一、继承Thread类创建线程类①定义Thread类的子类,并重写run方法。②创建Thread子类的实例。③调用start()方法。访问当前线程:Thread.currentThread().第二种方法:实现Runnable接口,重写run()方法,run()方法代表线程要执行的任务。可以这样写:启动 new Thread(Runnable r,S原创 2017-06-14 09:24:59 · 318 阅读 · 0 评论 -
Java集合---ConcurrentHashMap原理分析
集合是编程中最常用的数据结构。而谈到并发,几乎总是离不开集合这类高级数据结构的支持。比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap)。这篇文章主要分析jdk1.5的3种并发集合类型(concurrent,copyonright,queue)中的ConcurrentHashMap,让我们从原理上细致的了解它们,能够让我们在深度项目开发中获益非浅转载 2016-08-25 15:04:02 · 509 阅读 · 0 评论 -
HashMap与ConcurrentHashMap的区别
从JDK1.2起,就有了HashMap,正如前一篇文章所说,HashMap不是线程安全的,因此多线程操作时需要格外小心。在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从此Map也有安全的了。ConcurrentHashMap具体是怎么实现线程安全的呢,肯定不可能是每个方法加synchronized,那样就变成了HashTable原创 2016-08-25 14:37:59 · 625 阅读 · 0 评论