当前位置: 首页 > 网络应用技术

7个序列问题揭示了Java的多线程!

时间:2023-03-06 17:42:42 网络应用技术

  摘要:许多来自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。