初学者必看!如何解决Java线程不安全问题 对于java初学者来说应该听过Java线程不安全的问题线程修改变量时会将变量拷贝到本地内存修改完成后再写回主内存。这个过程中如果多个线程同时访问并修改同一个数据就会出现线程安全问题。但是大多数人可能不知道如何解决此问题下面与小编一起来看看吧如何解决线程不安全呢答基于 JVM 的内置锁机制可以使用 synchronized 关键字保证同一时间只会有一个线程访问特定的代码块或对象。使用 synchronized 关键字确实能解决线程不安全。那么 synchronized 的原理是什么加上 synchronized 关键字后发生了什么使得线程变得安全了答synchronized 接收一个参数对象它作用于此参数对象的 markword 部分加上 synchronized 关键字后当第一个线程开始执行被锁定的代码块时此对象的 markword 上将会记录下它被哪个线程锁定。 当其他线程想要访问此对象时发现锁已被第一个线程锁定其他线程将被阻塞直到锁被释放然后重新抢占锁。你提到了 markword那么请介绍一下 Java 对象在内存中的存储形式。答我们知道计算机以二进制的方式存储数据以 64 位虚拟机为例Java 对象在内存中的存储形式为开头是 8 个字节的 markword用于标记对象的状态。也就是一个 long 型数据的大小。不妨记作对象头里有一个长长的 markword。然后是 4 个字节的 class pointer用于找到自己的类也就是让这个对象搞清楚“我是谁”这个深刻的哲学问题。如果没有开启指针压缩class pointer 占 8 个字节。然后是实际数据也就是这个对象中定义的属性。最后的字节用于对齐保证对象大小是 8 个字节的倍数这样方便内存管理。markword 除了记录了锁的信息还记录了内存回收信息和 hashcode 信息。