摘要:许多来自Java的新移民想到了Java Multi -Threads,他们会感到非常头晕和头晕。可以看到什么,我不知道为什么同步锁定代码。
Java的许多新移民都想到了Java的多线程,他们感到非常头晕。可以看到什么,我不知道为什么同步锁定代码。
因此,我将在这里提出多个问题。如果您可以很好地回答这些问题,那么您对Java多线程线程的原理有所了解。您还可以学习此背后的核心原则。
问:Java中的主要内存和工作记忆是什么意思?
在Java中,主内存中的对象引用将被复制到每个线程的工作内存,并且变量的修改将同时馈回主内存。
因此,当我们知道使用每个线程的内存数据时,实际上就有主内存和工作存储器。每次都不一定会从同一内存中获取数据。
或了解使用数据时会有缓存。
问:多线程不可见的原因是什么?
答:让我们谈谈虚拟机定义的内存原子操作:
根据这些说明,查看图片,然后查看图片后的过程说明,这很容易理解。
因此,多线程普通变量的读取和写作操作是并发的,主要是2分:
问:为什么可以看到波动性关键字?可见性是在修改并发修改后,该值的修改立即可见其他线程。
答:Java内存模型桩挥发性定义以下特殊规则:
禁止说明进行排序的原理是在分配挥发性变量时添加1个锁定操作,并且在先前指定的内存模型原理中,锁定可用于进行负载或安排,因此形成了内存屏障。
问:上面提到的是,锁定后,它将限制每个工作内存的值以刷新主内存。进入后可以使用负载。底部如何?
答:CPU总线锁定+缓存一致性+嗅探机制,这是对计算机组成原理的了解。
这就是为什么违规变量不能设置过多的原因。如果设置太多,可能会导致公共汽车风暴,从而大大增加CPU嗅探的成本。
问:添加同步关键字方法的原理是什么?volatie有什么区别?
A::
具体过程如下:
请注意,如果它是同步{}代码块,则可以通过在代码中添加MonitorEnter和MonitoreXit指令来实现采集和退出操作。
如果您知道C语言,可以看一下这个大兄弟Java在OpenJDK源代码下熟练熟练掌握objectMonitor
问:每次解锁时,同步需要切换内核和用户模式。JVM是否优化了此过程?
答:在JDK1.6之后,引入了锁定升级的概念,此锁定升级为Sync关键字
有四种类型的锁,水平从低到高:没有锁,有偏见的锁,轻量级锁,重量级锁
这四个州将逐渐升级竞争,这是一个不可逆转的过程。它只能升级(从低水平到高水平),并且不能锁定水平(高级别至低水平)
因此,同步关键字不是开始时耗尽同步的时间。它根据情况逐步升级
2.修改对象头的线程ID时,它表明存在竞争。
3.但是,如果同步方法/代码块执行长时间,那么使用轻量级锁定旋转带来的性能消耗比使用重量级锁更为严重。在这个问题中提到的时间。
问:锁可以仅升级并且不能降级。您无法降级吗?
答:它可能会被降级,并且不可能拥有共享资源竞争的锁定。Java具有在运行期间优化的函数。有必要打开服务器模式加上+docapeanalysis以打开逃生分析。
如果确定共享变量在运行过程中不逃脱,则直接在编译级别删除锁
示例:StringBuffer.Append()。append()
例如,如果您发现StringBuffer无法逃脱,它将删除附加的同步
而且这种情况必须仅发生在偏置锁中,因此偏置锁可以重置为无锁状态。
本文分享了华为云社区的诚意,作者:BreakDraw。