先说答案:要加;
要是想模拟多线程情况进行测试,很难出问题(需要很高的并发量);
volatile的两个作用:
如果不加,线程1可能先建立连接、后赋值,那么线程2同时取这个值就会出问题;
volatile的实现原理是内存屏障。
普通对象:
数组:
这一块涉及到锁升级的过程
在jdk1.0的时候,synchronized是重量级的锁,每一次申请资源都需要通过操作系统(OS)来进行,特别耗费资源。
如今,在jdk1.8,synchronized进行了不断地优化,变得更加高效,涉及到锁升级的过程,而markword当中装了锁的信息。
锁升级过程
无锁–>偏向锁–>自旋锁–>重量级锁,所只能升级,不能降级;
ABA问题
为了解决ABA问题,JDK为提供了AtomicMarkableReference和AtomicStampedReference类来解决这个问题。其中,AtomicStampedReference是利用版本戳的形式记录了每次改变以后的版本号。
对象头中的markword
JVM使用的是直接指针的方式
它的唯一好处就是:对象小,垃圾回收时不用频繁改动t
方法区
《Java 虚拟机规范》只是规定了有⽅法区这么个概念和它的作⽤,并没有规定如何去实现
它。那么,在不同的 JVM 上⽅法区的实现肯定是不同的了。 ⽅法区和永久代的关系很像
Java 中接⼝和类的关系,类实现了接⼝,⽽永久代就是 HotSpot 虚拟机对虚拟机规范中⽅
法区的⼀种实现⽅式。 也就是说,永久代是 HotSpot 的概念,⽅法区是 Java 虚拟机规范中
的定义,是⼀种规范,⽽永久代是⼀种实现,⼀个是标准⼀个是实现,其他的虚拟机实现并
没有永久代这⼀说法。JDK1.8取消了永久代,改为元空间。
因篇幅问题不能全部显示,请点此查看更多更全内容