并发编程
@Peanut
这个作者很懒,什么都没留下…
展开
-
悲观锁与乐观锁(面试必备)
悲观锁与乐观锁.转载 2020-03-30 12:23:32 · 117 阅读 · 0 评论 -
ConcurrentHashMap介绍
ConcurrentHashMap使用了锁分段技术来提供更高的并发性和伸缩性。锁分段技术就是说容器里有多把锁,每一把锁用于锁容器其中一部分数据,当多线程访容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效提高并发效率。在CurrentHashMap中,首先将数据分成一段一段的存储,然后给每段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。可重入...转载 2020-03-24 19:51:43 · 357 阅读 · 0 评论 -
简述Java内存模型的happen before原则
先行发生原则(Happens-Before)是判断数据是否存在竞争、线程是否安全的主要依据。先行发生是Java内存,模型中定义的两项操作之间的偏序关系,如果操作A先行发生于操作B,那么操作A产生的影响能够被操作B观察到。口诀:如果两个操作之间具有happen-before关系,**那么前一个操作的结果就会对后面的一个操作可见。**是Java内存模型中定义的两个操作之间的偏序关系。常见的hap...转载 2020-03-24 18:34:34 · 520 阅读 · 0 评论 -
为什么HashMap线程不安全
1.put操作时导致多线程数据不一致当有多个线程进行put操作时假设现在有两个线程A跟B进行put操作,线程A已经计算完要放入记录的桶的索引坐标,但是还没有将记录插到桶里面时A的时间片就已经用完,然后轮到线程B执行,假设B的索引坐标跟A的一样,不同点是线程B成功插入记录,那么线程A再次被调度运行时,所用的索引坐标跟线程B的索引坐标一样,线程A将记录插入之后,就会把线程B插入的记录覆盖掉,因此...原创 2020-03-24 17:37:34 · 111 阅读 · 0 评论 -
volatile关键字的两层语义
1.保证了不同线程对被volatile修饰的变量进行操作时的可见性,对volatile变量的所有写操作能立刻反应到其他线程中,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 2.禁止指令重排序优化。...原创 2020-03-23 19:37:59 · 110 阅读 · 0 评论 -
volatile能保证有序性吗?
volatile能保证有序性多线程通过抢占时间片来执行自己的代码体,所以我们会感觉到线程是同时执行完的,除了引入了时间片以外,由于处理器优化和指令重排等,CPU还可能对输入代码进行乱序执行,比如我们拿到数据要执行写库,查询,删除这三个操作,这就会可能要涉及到有序性的问题了。volatile可以禁止指令指令重排序,这就保证了代码的程序会严格按照代码的先后顺序执行。这就保证了有序性。被volat...转载 2020-03-23 19:21:34 · 899 阅读 · 0 评论 -
volatile的原理和实现机制 || volatile到底如何保证可见性和禁止指令重排序的?
下面这段话摘自《深入理解Java虚拟机》:“观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令”lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:1)它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句...转载 2020-03-23 18:56:43 · 275 阅读 · 0 评论 -
volatile能保证原子性吗?
volatile不能保证原子性。当跟自增操作一起时,自增操作本身不是原子性操作。class Data { public volatile int number; public void add(){ number++; }}public class Main { public static void main(String[] args) {...转载 2020-03-23 18:46:48 · 3486 阅读 · 5 评论 -
线程启动的方法start()和run()
1.start使用start方法才真正实现了多线程运行,因为使用start()方法不用等待run方法体代码执行完毕而直接继续执行下面的代码。因为thread线程有5种状态,创建-就绪-运行-阻塞-死亡这五种,用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,等到cpu空闲时,才会执行线程里面的run方法,run方法运行完毕,此线程结束。2.ru...转载 2020-03-23 18:17:42 · 3948 阅读 · 0 评论 -
哪些是线程安全的容器
同步容器类:使用了synchronized1.Vector2.HashTable并发容器:3.ConcurrentHashMap:分段4.CopyOnWriteArrayList:写时复制5.CopyOnWriteArraySet:写时复制Queue:6.ConcurrentLinkedQueue:是使用非阻塞的方式实现的基于链接节点的无界的线程安全队列,性能非常好。(jav...转载 2020-03-23 16:57:46 · 1204 阅读 · 0 评论 -
对象的内存布局
对象的内存布局包括三个部分:对象头,实例数据和对齐填充。对象头:对象头包括两部分信息,第一部分是存储对象自身的运行时数据,如哈希码,GC分代年龄,锁状态标志,线程持有的锁等等。第二部分是类型指针,即对象指向类元数据的指针。实例数据:指的就是数据(成员变量的值,包括父类成员变量和本类成员变量。)对齐填充:不是必然的存在,也没有特别的含义,就是为了对齐。...原创 2020-03-23 16:45:37 · 90 阅读 · 0 评论 -
线程安全
线程安全就是多线程访问时,采用了加锁机制。当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据...原创 2020-03-23 16:38:11 · 99 阅读 · 0 评论 -
同步、异步、阻塞、非阻塞
同步:就是在发出一个调用时,在没有得到结果之前, 该调用就不返回。调用者需要一直等待结果。异步:调用在发出之后,这个调用就直接返回了,但没有返回结果,等处理完该调用后,通知调用者结果。阻塞调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞在不能立刻得到结果之前,该调用不会阻塞当前线程。举例:人物:老张道具:普通水壶(水烧开不响);响水壶(水烧开发出...原创 2020-03-23 15:34:20 · 127 阅读 · 0 评论 -
volatile和synchronized的区别
1.volatile本质是在告诉JVM当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取。synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别。3.volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的...原创 2020-03-22 22:49:07 · 197 阅读 · 0 评论 -
java同步线程有哪些方式?
参考:https://blog.csdn.net/Michaeles/article/details/86500835.转载 2020-03-22 22:08:40 · 171 阅读 · 0 评论