
【并发编程】
多总结,多学习 这样就不用加晚班。
DominicElvira
多总结,多学习 ,形成方法论
展开
-
老生常谈的ConcurrentHashMap实现原理详解
Jdk 1.7 之前,ConcurrentHashMap 通过加锁保证线程安全,并引入锁分段机制以减小加锁的粒度,从而提升性能。Jdk 1.8 中的 ConcurrentHashMap 实现则引入了 CAS 机制以尽量避免加锁操作,虽然仍然有部分同步代码,不过锁的粒度相对于分段锁而言更加细粒度。另外一个重要的设计就是在结点个数达到阈值时会自动将链表转换成红黑树,从而进一步提升性能。存储结构设计在存储结构设计上,新的 ConcurrentHashMap 相对于之前看起来更加的简洁。如下图,在一个 Node原创 2020-10-12 08:42:06 · 1981 阅读 · 2 评论 -
synchronize底层实现原理以及相关的优化
首先来说下synchronize和Lock的区别:两者都是锁,用来控制并发冲突,区别在于Lock是个接口,提供的功能更加丰富,除了这个外,他们还有如下区别:synchronize自动释放锁,而Lock必须手动释放,并且代码中出现异常会导致unlock代码不执行,所以Lock一般在Finally中释放,而synchronize释放锁是由JVM自动执行的。Lock有共享锁的概念,所以可以设置读写锁提高效率,synchronize不能。(两者都可重入)Lock可以让线程在获取锁的过程中响应中断,而sync转载 2020-10-10 16:17:03 · 235 阅读 · 0 评论 -
#多线程学习——ThreadPoolExecutor之不允许使用Executors创建
在阿里巴巴开发手册的并发处理那章提到线程池不允许使用Executor来创建,要用ThreadPoolExecutor的方式来创建本文就来分析一下为什么不能使用Executor来创建。其实手册下面说明已经说了1)FixedThreadPool 和 SingleThreadPool:允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。2)Cach...原创 2019-03-20 17:45:59 · 535 阅读 · 1 评论 -
#多线程学习——start()和run()的区别
start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。start()不能被重复调用。run() : run()就和普通的成员方法一样,可以被重复调用。单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程。...原创 2018-10-12 14:09:41 · 199 阅读 · 0 评论 -
#多线程学习——Thread 和 Runnable的区别
常用的多线程的实现方式有两种——继承Thread类、实现Runnable接口那他们的区别是什么呢?1.Runnalble具有更好的拓展性Thread 是类,而Runnable是接口(Thread本身是实现了Runnable接口的类)。一个类只能继承一个父类,而一个类可以实现多个Runnable接口,所以Runnable具有更好的拓展性。2.Runnable可以用于“资源的共享”多个线程都...原创 2018-10-12 11:49:51 · 784 阅读 · 0 评论 -
#多线程学习——线程的5种状态
线程状态图原创 2018-10-12 11:50:39 · 339 阅读 · 0 评论 -
Synchronize关键字详解
前言synchronized关键字,多线程并发编程最常用关键字作用对于synchronized关键字的作用,简单来说一句话就可以概况:在同一时刻,最多只有一个线程能执行该段代码。以串行化的方式执行代码,自然不存在线程安全问题。用法synchronized关键字的用法大致可以分为两类:对象锁和类锁。当然,Java中一切皆对象,类也是对象。所以这里的对象锁中的对象可以认为是狭义上的对象。对象锁:锁住的是一个对象,具体用法是利用synchronized关键字修饰非静态方法或者synchron原创 2020-10-11 16:32:17 · 1178 阅读 · 0 评论