【Java】回顾一下Java中的synchronized

简介: synchronized在JDK1.5之前是一个重量级锁,相当于JUC里面的lock锁,但是在1.6版本及之后对它做了很大的升级和优化,它不在那么的笨重了。

synchronized在JDK1.5之前是一个重量级锁,相当于JUC里面的lock锁,但是在1.6版本及之后对它做了很大的升级和优化,它不在那么的笨重了。

synchronized的作用主要有三个
原子性:确保线程互斥的访问同步代码。
可见性:保证共享变量的修改能够及时可见
有序性:有效解决重排序问题,即一个unlock操作先行发生于后面对同一个锁lock操作。

synchronized的使用

synchronized的三种使用方式:

  • 修饰实例方法:作用于当前实例加锁。

代码里面是在方法前面加上synchronized,就是publich后加上synchronized,代码实例如下:

public synchronized getMethod(){
  // todo 实现方法
}

修饰静态方法:作用于当前类对象加锁
静态方法是属于类而不是对象的。同样的synchronized修饰的静态方法说的是这个类的所有对象

public synchronized static void getMethod() {
   // todo
}

修饰代码块:指定加锁对象,对给定对象加锁。
一个线程访问一个对象中的synchronized(this)同步代码块时,其他试图访问该对象的线程将被阻塞。

synchronize的底层实现

在JVM中对象在内存的布局分为三块区域:对象头,实例数据和对齐填充。那synchronized的底层实现,锁就是存在对象头里的,那为什么是对象头呢?hotspot虚拟机的对象头主要包括两部分数据:Mark Word(标记字段),class pointer(类型指针)。其中class point是对象指向它的类元素的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。Mark Word用于存储对象自身运行时的数据,它是实现轻量级锁和偏向锁的关键。

synchronized在JVM里面实现都是基于进入和退出monitor对象来实现方法同步和代码块同步的,具体细节都可以通过对monitorEnter和monitorEixt实现的。
monitorEnter指令:插入在代码块的开始位置,当代码执行带该指令时,将会尝试获取对象monitor的所有权,即尝试获得该对象锁。
monitorExit指令:插入在方法结束和异常出,JVM保证每个monitorEnter都有对应的monitorExit

Synchronized锁升级的顺序

Synchronized在1.6之前是重量级锁,如果第一个线程使用了它,下一个线程想要使用就得等它释放了才能使用。如果发成阻塞了就得一直等待下去,所以效率低下。
1.6之后做了很大的优化,有了锁升级的过程。依次是:无锁状态,偏向锁状态,轻量级锁状态,重量级锁状态。锁是单向执行只能升级,不能降级的。这个过程也是开销逐渐加大的过程。
一开始如果是一个线程的时候是无锁状态,下一次同一个线程进来还是无锁状态,如果有其他线程跟第一个线程进行竞争就会升级为CAS偏向锁,若锁竞争激烈就会升级会轻量级锁,最后升级为重量级锁。
image.png

相关文章
|
4月前
|
Java 开发者 C++
Java多线程同步大揭秘:synchronized与Lock的终极对决!
Java多线程同步大揭秘:synchronized与Lock的终极对决!
84 5
|
4月前
|
存储 Oracle 安全
揭秘Java并发核心:深入Hotspot源码腹地,彻底剖析Synchronized关键字的锁机制与实现奥秘!
【8月更文挑战第4天】在Java并发世界里,`Synchronized`如同导航明灯,确保多线程环境下的代码安全执行。它通过修饰方法或代码块实现独占访问。在Hotspot JVM中,`Synchronized`依靠对象监视器(Object Monitor)机制实现,利用对象头的Mark Word管理锁状态。
53 1
|
4月前
|
设计模式 安全 Java
Java并发编程实战:使用synchronized关键字实现线程安全
Java并发编程实战:使用synchronized关键字实现线程安全
62 0
|
1月前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
44 4
|
2月前
|
算法 Java 程序员
Java中的Synchronized,你了解多少?
Java中的Synchronized,你了解多少?
|
2月前
|
Java
让星星⭐月亮告诉你,Java synchronized(*.class) synchronized 方法 synchronized(this)分析
本文通过Java代码示例,介绍了`synchronized`关键字在类和实例方法上的使用。总结了三种情况:1) 类级别的锁,多个实例对象在同一时刻只能有一个获取锁;2) 实例方法级别的锁,多个实例对象可以同时执行;3) 同一实例对象的多个线程,同一时刻只能有一个线程执行同步方法。
20 1
|
2月前
|
Java 开发者
在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选
【10月更文挑战第6天】在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选。相比 `synchronized`,Lock 提供了更灵活强大的线程同步机制,包括可中断等待、超时等待、重入锁及读写锁等高级特性,极大提升了多线程应用的性能和可靠性。通过示例对比,可以看出 Lock 接口通过 `lock()` 和 `unlock()` 明确管理锁的获取和释放,避免死锁风险,并支持公平锁选择和条件变量,使其在高并发场景下更具优势。掌握 Lock 接口将助力开发者构建更高效、可靠的多线程应用。
26 2
|
2月前
|
安全 Java 开发者
java的synchronized有几种加锁方式
Java的 `synchronized`通过上述三种加锁方式,为开发者提供了从粗粒度到细粒度的并发控制能力,满足了不同场景下的线程安全需求。合理选择加锁方式对于提升程序的并发性能和正确性至关重要,开发者应根据实际应用场景的特性和性能要求来决定使用哪种加锁策略。
28 0
|
3月前
|
存储 安全 Java
Java并发编程之深入理解Synchronized关键字
在Java的并发编程领域,synchronized关键字扮演着守护者的角色。它确保了多个线程访问共享资源时的同步性和安全性。本文将通过浅显易懂的语言和实例,带你一步步了解synchronized的神秘面纱,从基本使用到底层原理,再到它的优化技巧,让你在编写高效安全的多线程代码时更加得心应手。
|
3月前
|
缓存 Java 编译器
JAVA并发编程synchronized全能王的原理
本文详细介绍了Java并发编程中的三大特性:原子性、可见性和有序性,并探讨了多线程环境下可能出现的安全问题。文章通过示例解释了指令重排、可见性及原子性问题,并介绍了`synchronized`如何全面解决这些问题。最后,通过一个多窗口售票示例展示了`synchronized`的具体应用。